redis介绍以及安装
一、redis介绍
redis是一个key-value存储系统。和Memcached类似,它支持存储的values类型相对更多,包括字符串、列表、哈希散列表、集合,有序集合。
这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
本质:将数据保存在内存中
用途:redis可以做缓存;redis可以做消息队列
特性:
- 可以做持久化:在配置文件设置,如果你要保存到文件,可添加设置,就算电脑不小心关机了,数据还是在的。这个要不要保存都是自己来定的。
- 支持存放数据的格式多(5种格式)
{ 'k1':'hiayna', #第一种字符串格式 'k2':[11,22,33,44], #第二种列表格式 'k3':{11,22,33,44}, #第三种集合格式 'k4':{ #第四种,字典,也可以叫做哈希散列表, 'n1':'xxx', 'n2':'fff' }, 'k5':{(11,1),('xxx':5)} #有序集合 }
二、相关问题
1、为什么要使用redis?使用redis有哪些好处?
(1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1) (2) 支持丰富数据类型,支持string,list,set,sorted set,hash (3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行 (4) 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除
2、redis相比memcached有哪些优势?
(1) memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型 (2) redis的速度比memcached快很多 (3) redis可以持久化其数据
三、redis的安装
方式一:硬盘免安装
wget http://download.redis.io/releases/redis-3.0.6.tar.gz #下载 tar xzf redis-3.0.6.tar.gz #解压 cd redis-3.0.6 #切换到redis make #安装
启动服务端
src/redis-server
启动客户端
src/redis-cli redis> set foo bar OK redis> get foo "bar"
方式二:安装包
yum install redis /etc/init.d/redis start #开启 /etc/init.d/redis restart #重启 配置:/etc/redis/redis.conf #默认会读取这个文件去运行
方式三:rpm安装
公司说你安装以下redis
有两种情况:
1、直接给你rpm包
2、或者说你直接yum install redis
- 安装公司自定制
- 安装官方
ls #查看 ctrl+c #停止 结束进程(找服务器并杀掉): ps -e|grep redis #杀掉 kill -9 12343 #重新运行
远程操作rdis的模块(模块的本质是通过socket进行通信的)
mysql的端口:3306
redis的端口:6379
四、Python操作Redis
sudo pip install redis or sudo easy_install redis or 源码安装 详见:https://github.com/WoLpH/redis-py
"""
1、官网下载:安装包或是绿色面安装
2、安装并配置环境变量
"""
redis VS mysql
"""
redis: 内存数据库(读写快)、非关系型(操作数据方便、数据固定)
mysql: 硬盘数据库(数据持久化)、关系型(操作数据间关系、可以不同组合)
大量访问的临时数据,才有redis数据库更优
"""
redis VS memcache
"""
redis: 操作字符串、列表、字典、无序集合、有序集合 | 支持数据持久化(数据丢失可以找回(默认持久化,主动持久化save)、可以将数据同步给mysql) | 高并发支持
memcache: 操作字符串 | 不支持数据持久化 | 并发量小
"""
Redis操作
启动服务
"""
前提:前往一个方便管理redis持久化文件的逻辑再启动服务:dump.rdb
1)前台启动服务
>: redis-server
2)后台启动服务
>: redis-server --service-start
3)配置文件启动服务
>: redis-server 配置文件的绝对路径
>: redis-server --service-start 配置文件的绝对路径
eg>: redis-server --service-start D:/redis/redis.conf
"""
密码管理
"""
1)提倡在配置文件中配置,采用配置文件启动
requirepass 密码
2)当服务启动后,并且连入数据库,可以再改当前服务的密码(服务重启,密码重置)
config set requirepass 新密码
3)连入数据库,查看当前服务密码密码
config get requirepass
"""
连接数据库
"""
1)默认连接:-h默认127.0.0.1,-p默认6379,-n默认0,-a默认无
>: redis-cli
2)完整连接:
>: redis-cli -h ip地址 -p 端口号 -n 数据库编号 -a 密码
3)先连接,后输入密码
>: redis-cli -h ip地址 -p 端口号 -n 数据库编号
>: auth 密码
"""
关闭服务
"""
1)在没有连接进数据库时执行
>: redis-cli shutdown
2)连接进数据库后执行
>: shutdown
"""
切换数据库
"""
1)在连入数据库后执行
>: select 数据库编号
"""
数据持久化
"""
1)配置文件默认配置
save 900 1 # 超过900秒有1个键值对操作,会自动调用save完成数据持久化
save 300 10 # 超过300秒有10个键值对操作,会自动调用save完成数据持久化
save 60 10000 # 超过60秒有10000个键值对操作,会自动调用save完成数据持久化
2)安全机制
# 当redis服务不可控宕机,会默认调用一下save完成数据持久化
3)主动持久化
>: save # 连入数据库时,主动调用save完成数据持久化
注:数据持久化默认保存文件 dump.rdb,保存路径默认为启动redis服务的当前路径
"""
#####
Redis数据类型
"""
数据操作:字符串、列表、哈希(字典)、无序集合、有序(排序)集合
有序集合:游戏排行榜
字符串:
set key value
设置key,value
get key
获取value
mset k1 v1 k2 v2 ...
设置多个值;eg:r.mset({'age':12,'pk':13,'ad':14,'fs':15,'ls':16});在库中一个建(age)对应一个值(12)
mget k1 k2 ...
获取k1/k2中对应的值,以列表展示出来
setex key exp value
设置key和value,根据exp时间而过期,以秒为单位
incrby key increment
将key所有的值给increment增量(这个值为整数)
列表:
rpush key value1 value2 ...
以key 为主键,value1...为值得列表,从左到右
lpush key value1 value2 ...
以key 为主键,value1...为值得列表,从右到左
lrange key bindex eindex
获取列表指定范围内的元素,若获取的范围大,不报错
lindex key index
通过索引获取列表中的元素,若索引的值大于元素个数,就会报错
lpop key | rpop key
lpop key从左删除,并取打印出值;rpop key从右删除,并取出打印值。
linsert key before|after old_value new_value
linsert key before old_value new_value:old_value 之前插入一个值
linsert key after old_value new_value:old_value 之前插入一个值
eg:r.linsert('name2','before' ,'aaa', 'there')
在aaa前插入there
哈希(字典):
hset key field value
添加值,key为表,field为主键,value为值eg:r.hset('student','age',18,)
hget key field
获取值key为表,field为主键eg:r.hset('student','age')==>18
hmset key field1 value1 field2 value2 ...
一次添加多个值eg:r.hmset('student',{'name':'egon','age':30,})
hmget key field1 field2
一次查询多个值eg:r.hmget('student','name','age')
hkeys key
获取一个或多个主键值eg:r.hkeys('student')
hvals key
获取一个或多个主键值eg:r.hvals('student'
hdel key field
删除一个或多个值eg:r.hdel('student','age','name')
集合:
sadd key member1 member2 ...
添加集合的值eg:r.sadd('student','a','b','c','d')
sdiff key1 key2 ...
返回给定所有集合的差集eg:r.sdiff('student','student1')取出student中student1没有的一部分。
sdiffstore newkey key1 key2 ...
返回给定所有集合的差集并存储到newkey中egr.sdiffstore('student2','student','student1')
sinter key1 key2 ...
返回集合key1和key2的交集eg:r.sinter('student','student1')
sunion key1 key2 ...
返回集合key1和key2的交集,eg:r.sunion('student','student1')
smembers key
返回集合key中所有的元素eg:r.smembers('student')
spop key
删除集合key中元素,一个一个的删。。。eg:r.spop('student')
有序集合:
zadd key grade1 member1 grade2 member2 ...
添加并且排序eg:r.zadd('student3',{'jsom':90,'pad':99,'tom':30})
zincrby key grade member
有序集合中指定成员的分数加数eg:r.zincrby('student3',1000,'jsom')
zrange key start end
通过索引区间返回有序集合指定区间内的成员eg:r.zrange('student3',1,2),从小到大
zrevrange key start end
返回有序集中指定区间内的成员,通过索引,分数从高到低eg:r.zrange('student3',1,2),从大到小
"""
python使用redis
依赖
>: pip3 install redis
直接使用
import redis
r = redis.Redis(host='127.0.0.1', port=6379, db=1, password=None, decode_responses=True)
连接池使用
import redis
pool = redis.ConnectionPool(host='127.0.0.1', port=6379, db=1, max_connections=100, password=None, decode_responses=True)
r = redis.Redis(connection_pool=pool)
缓存使用:要额外安装 django-redis
# 1.将缓存存储位置配置到redis中:settings.py
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/0",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"CONNECTION_POOL_KWARGS": {"max_connections": 100},
"DECODE_RESPONSES": True,
"PSAAWORD": "",
}
}
}
# 2.操作cache模块直接操作缓存:views.py
from django.core.cache import cache # 结合配置文件实现插拔式
# 存放token,可以直接设置过期时间
cache.set('token', 'header.payload.signature', 300)
# 取出token
token = cache.get('token')