HyperLogLog
HyperLogLog用来统计数量,它所占内存为12KB,当数量越大时,结果会存在一定偏差,适用于统计不需要精确值以及准确数量的场景,比如说页面的UV。
pfadd codehole user1 user2 (integer) 1
pfcount codehole # 返回统计数量 (integer) 2
消息
pubsub
subscribe channel channel2 # 同时订阅channel和channel2
psubscribe channel* # 同时订阅channel开头的频道
publish channel "hello world" # 发布后,订阅channel的客户端会收到消息,内容为
hello world
pubsub可以有多消费者,不会持久化,没有消费确认机制
stream
stream是Redis一种新的数据结构,删除消息所有内容可以用del命令
xadd codehole * name zhangsan age 18
说明:返回消息ID,给codehole增加一条消息,*表示服务器自动生成ID,后面顺序跟着key、value
xdel 消息ID # 删除消息
xrange codehole - +
说明:获取消息列表,-表示最小值,+表示最大值,可以用消息ID指定
xlen codehole # 获取消息长度
xread [block 1000] count 2 streams codehole 0-0
说明:从codehole中读取2条消息,最后的0-0表示从头开始读,$表示从尾部开始读,block是可选项,block 1000表示阻塞1s,如果1s内没有任何消息到来,就返回nil;如果是block 0,表示持续阻塞
xgroup create codehole cg1 0-0 # 创建消费组cg1,从头开始消费
xgroup setid codehole cg1 $ # 消费组cg1从尾部开始消费
xgroup destory cg1 # 删除 消费组cg1
xreadgroup group cg1 c1 count 1 codehole >
说明:消费组cg1中的消费者c1,读取一条最新的消息
xack codehole cg1 消息ID # 消费组cg1确认消费
xgroup delconsumer codehole cg1 c1 # 删除消费组cg1中的消费者c1
xinfo stream codehole # 查看codehole信息
xinfo groups codehole # 查看codehole的消费组信息
xinfo consumers codehole cg1 # 查看codehole名称为cg1下的消费者信息
xtrim codehole maxlen [~|=] 1000
说明:裁剪codehole至最少1000个消息,可选项=表示精确裁剪到1000个,可选项~表示裁剪到1000个左右,但不会少于1000个
持久化
Redis持久化机制有三种,一种是RDB,一种是AOF,一种是两者结合。RDB是全量备份,AOF是日志追加。使用save或者bgsave命令可以让redis进行一次RDB备份。在配置文件中可以看到诸如save 900 1之类的命令,表示的是在900s内有1次redis写入,则进行一次RDB备份。
管道
一般的Redis操作是一来一回,即发送一个命令,返回,再发送一个命令,再返回。Redis管道可以将多个命令打包一起发送,然后再一起返回,适用于不依赖上一个命令返回值的场景。如:批量插入,此种情况下使用管道将大幅提高效率。
事务
说明:
multi:开启一个事务
exec:执行一个事务
discard:放弃执行一个事务
watch:盯住一个变量,当在执行事务时,如果在执行事务之前,变量被修改,则不执行事务
unwatch:放弃盯住变量
注意:Redis事务出错会继续执行后面的命令,也就是说它不具有回滚的功能。
样例:
watch name
multi
set name lisi
exec
内存淘汰策略
当Redis内存超出maxmemory(可在配置文件配置)时,可选以下一种淘汰策略
- noeviction:可以读可以删除,不能更新,这是默认的淘汰策略
- volatile-lru:尝试淘汰设置了过期时间的key,最少使用的key优先被淘汰
- volatile-ttl:尝试淘汰设置了过期时间的key,剩余过期时间最少的key优先被淘汰
- volatile-random:尝试淘汰设置了过期时间的key,随机淘汰key
- allkeys-lru:所有key最少使用的优先被淘汰
- allkeys-random:所有key随机淘汰
- volatile-lfu:尝试淘汰设置了过期时间的key,访问频次最少的key优先被淘汰
- allkeys-lfu:所有key访问频次最少的优先被淘汰
lua命令
lua命令执行一段脚本,里面有一个或多个Redis命令
eval "return redis.call('set',KEYS[1],ARGV[1]),redis.pcall('incr',KEYS[1])" 1 age 1
说明:redis.call表示执行一个Redis命令,用单引号包装,多个命令间用逗号隔开,双引号后面的1表示有一个key,age对应KEYS[1],1对应ARGV[1],此句命令等同于set age 1、incr age
script load "return redis.call('set',KEYS[1],ARGV[1]),redis.pcall('incr',KEYS[1])" "6608684f24b7a06d0f806ffa9d246c7b7cfed01f"
说明:将该命令载入脚本,不执行
evalsha 6608684f24b7a06d0f806ffa9d246c7b7cfed01f 1 name 1
说明:执行上述脚本,并指定key的数量,key值,argv值。如果脚本不存在,会提示
script exists 6608684f24b7a06d0f806ffa9d246c7b7cfed01f # 查看脚本是否存在
script kill # 杀死当前正在执行的lua脚本(尚未执行写入操作)
script flush # 清除所有脚本缓存
主从
假设当前有一个Redis服务端口号为6379,另一个Redis服务端口号为7000
slaveof localhost 7000
此时6379的数据将会被清除,同时成为7000的从服务器,7000的任何写命令最终都会同步到6379上。
哨兵与集群
哨兵 Sentinel
假设Redis服务是一主一从,将服务与哨兵相连,当主节点发生故障时,哨兵会将从服务升级为主服务。将应用与哨兵服务相连,这样就相当于发生故障时,应用无需修改配置即可完成自动切换。
集群 cluster
集群通过槽位定位算法来确定key落于哪一个槽位,大致是根据一定的算法对key进行hash得到一个整数,然后用这个整数值对16384进行取模来得到具体槽位
当客户端向一个错误的节点发出指令后,节点会向客户端发送一个跳转指令,如下,3000是x对应的槽位编号,后面的是目标节点地址
GET x
-MOVED 3000 127.0.0.1:6379
当节点有增加或者删减时,集群会自动将数据迁移,迁移完毕会通知。在迁移过程中,客户端仍会向原来的节点发送请求,如果有则正常处理,否则告诉客户端去目标节点查看数据是否存在。