redis
Redis (remote dictionary server )是⼀种基于键值对的NoSQL数据库,它提供了对多种数据类型(字符串、哈希、列表、集合、有序集合、位图等)的⽀持,能够满⾜很多应 ⽤场景的需求。Redis将数据放在内存中,因此读写性能是⾮常惊⼈的。与此同时,Redis也提供了持久化机制,能够将内存中的数据保存到硬盘上,在发⽣意外状况时数据也不会丢掉。此外,Redis还⽀持键过期、地理信息运算、发布订阅、事务、管道、Lua脚本扩展等功能,总⽽⾔之,Redis的功能和性能都⾮常强⼤,如果项⽬中要实现⾼速缓存和消息队列这样的服务,直接交给Redis就可以了。
redis官方文档redisdoc.com
redis优点
-
Redis的读写性能极⾼,并且有丰富的特性(发布/订阅、事务、通知等)。
-
Redis⽀持数据的持久化(RDB和AOF两种⽅式),可以将内存中的数据保存在磁盘中,᯿启的时候可以再次加载进⾏使⽤。
-
Redis⽀持多种数据类型,包括:string、hash、list、set,zset、bitmap、hyperloglog等。
-
Redis⽀持主从复制(实现读写分析)以及哨兵模式(监控master是否宕机并⾃动调整配置)。
-
Redis⽀持分布式集群,可以很容易的通过⽔平扩展来提升系统的整体 性能。
-
Redis基于TCP提供的可靠传输服务进⾏通信,很多编程语⾔都提供了Redis客户端⽀持。
redis应用场景
-
⾼速缓存 - 将不常变化但⼜经常被访问的热点数据放到Redis数据库中,可以⼤⼤降低关系型数据库的压⼒,从⽽提升系统的响应性能。
-
排⾏榜 - 很多⽹站都有排⾏榜功能,利⽤Redis中的列表和有序集合可以⾮常⽅便的构造各种排⾏榜系统。
-
商品秒杀/投票点赞 - Redis提供了对计数操作的⽀持,⽹站上常⻅的秒杀、点赞等功能都可以利⽤Redis的计数器通过+1或-1的操作来实现,从⽽避免了使⽤关系型数据的 update 操作。
-
分布式锁 - 利⽤Redis可以跨多台服务器实现分布式锁(类似于线程锁,但是能够被多台机器上的多个线程或进程共享)的功能,⽤于实现⼀个阻塞式操作。
-
消息队列 - 消息队列和⾼速缓存⼀样,是⼀个⼤型⽹站不可缺少的基础服务,可以实现业务解耦和⾮实时业务削峰等特性,这些我们都会在后⾯的项⽬中为⼤家展示。
redis下载安装启动
-
wget http://download.redis.io/releases/redis-5.0.5.tar.gz下载redis包 -
tar -xzf redis-5.0.5.tar解压redis包 -
sudo apt install build-essential -y安装电脑里所有软件的依赖包 -
在redis解压的包里有Makefile就可以直接运行
make命令进行编译,然后make install有些编译软件包没有Make文件,就运行它的配置文件,就会生成一个make文件,然后就可以
make进行编译
5.在redis解压包里更改redis.conf配置里的内容
daemonize yes
263行 dir /var/local/redis/ -- 固定dbfilename dump.rdb的位置,(首先在/var/local/下创建redis文件夹)
6.启动服务
将redis.conf复制到/usr/local/etc下
sudo cp redis.conf /usr/local/etc
系统配置放在/etc/下,用户自己的配置文件放在/usr/local/etc/下
redis-server /usr/local/etc/redis.conf
查看redis是否启动
ps aux|grep redis

7.连接redis
redis-cli
也可以指定地址和端口号:redis-cli [-h 'xxxx' -p 'xxxx']
redis-cli --raw其中--raw表示对于可能乱码进行自动转码

redis数据类型
string: 字符串类型
- 主要用在普通缓存
- set(key,value,expire)
- get(key)
- mset({k1:v1,k2:v2,...}) # 一次设置多个key
- mget([k1,k2,k3,...]) # 一次取多个key
- incr(key) / incrby(key) # 自增
- decr(key) / decrby(key) # 自减
- ttl(key) # 查看过期时间
- keys('*') # 可以使用通配符进行查找
- setnx(key,value) #如果key不存在,则设置,如果存在什么也不做,常用来做分布式锁
hash: 哈希类型
-
底层使用哈希表实现
-
主要用在缓存和对象存储
-
hset(name,key,value)
-
hget(name,key)
-
hgetall(name)
-
hmset(name,{k1:v1,k2:v2,...})
-
hmget(name,[k1,k2,k3,...])
-
hincrby(name,key,amount=1)
-
-
list: 列表类型(主要用在消息队列中)
-
底层使用双端链表
-
主要用来构造 “队列” 或者 “栈”
-
lpush / rpush(name,*values)
-
lpop / rpop(name)
-
blpop / brpop(name,timeout=0)
-
llen
-
lrange(name,start,end) 双闭区间,取出list中从start到end之间的元素
-
ltrim(name,start,end) 将列表截取为List中从start到end之间的元素,原来的list就会少了这些截取的元素
-
lset
-
lrem 从指定位置删 lrem(name,count,value) count大于0,从左边删,小于0从右边删,等于0全删
-
brpop功能: 从右到左扫描key1 ... keyN,对第一个非空List进行rpop操作并返回该值。如果所有List都是空或不存在,阻塞timeout秒,timeout为0表示一直阻塞。阻塞时,如果有其他client对key1 ... keyN中任意一个key进行push操作时,阻塞接触并返回。如果超时,则返回nil。其实就是相当于对多个队列(按照从尾队列
keyN到头队列key1)进行rpop。使用
redis.rpop不会阻塞,这样一直在死循环的找任务,占用cpu,造成不必要的浪费,使用redis.brpop在没有任务的时候阻塞,设置timeout=0,即是有list中有任务来到的时候就会自动将任务pop出去,由consumer消费掉 -
-
python 对list的一些常规操作
-
![]()
![]()
set: 集合类型
-
底层使用哈希表实现
-
主要用在数据去重和集合运算 (比如爬虫的分布式去重)
-
sadd
-
sinter # 交集
-
sunion # 并集
-
sdiff # 差集
-
sismember('ss',value) # 检查是否是集合中的某一个成员
-
smembers('ss') # 列举集合中的所有的成员
-
spop('ss') # 从集合中随机弹出一个元素
-
-

zset: 有序集合类型(常用在排行榜,以及带优先级的队列中)
-
底层使用跳表实现
-
主要用在数据排序,或排行榜的实现,以及带优先级的队列中
-
zadd(name,{k1:v1,k2:v2,...})
-
zrange(name,0,-1,withsores=True) # 带分数排序输出
-
zrevrange(name,0,-1,withsores=True) # 反转排序输出
-
zincrby(name,10,key)
-
-

在game中添加一个成员,直接使用zincrby

Pub/Sub(发布/订阅模式) (可用于聊天室)
-
publish(channel,msg) # 向channel发布一条消息
-
p=pubsub() # 创建一个pubsub对象
-
p.subscribe(channel) # 订阅一个频道
-
p.listen() # 开始监听频道内容,listen()的结果是一个迭代器,可以无限循环,(循环出来的结果是一个字典)

BitMap(位图)
用于去重最快,时间复杂度是O(N)
redis持久化
-
1.RDB
-
将内存中的数据直接生成一个镜像,保存到硬盘上
-
优点:快
-
缺点:两次保存的间隔内的数据有可能丢失
-
保存间隔:
-
15分钟内有1个key发生修改
-
5分钟内有10个key发生修改
-
1分钟内有10000个key发生修改
-
-
-
2.AOF:
-
记录每次对Redis的增、删、改操作,以追加的方式进行记录
-
优点:不会丢失数据
-
缺点:最终的AOF文件会比较大
-
Redis在进行主从复制时,从机会来读取主机的AOF文件,将操作同步到自己的DB上
-
在Python程序中使⽤Redis
可以使⽤pip安装redis模块。redis模块的核⼼是名为Redis的类,该类的对象代表⼀个Redis客户端,通过该客户端可以向Redis服务器发送命令并获取执⾏的结果。上⾯我们在Redis客户端中使⽤的命令基本上就是Redis对 象可以接收的消息,所以如果了解了Redis的命令就可以在Python中玩转Redis。
import redis
client = redis.Redis(host='1.2.3.4',port=6379,password='1qaz2wsx')
client.set('username', 'admin')
client.hset('student', 'name', 'hao') 1
client.hset('student', 'age', 38) 1
client.keys('*') [b'username', b'student']
client.get('username')
b'admin'
client.hgetall('student')
{b'name': b'hao', b'age': b'38'}
redis哨兵机制,参考网址:https://www.jianshu.com/p/06ab9daf921d



浙公网安备 33010602011771号