Redis其他功能

209 阅读5分钟

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(可在配置文件配置)时,可选以下一种淘汰策略

  1. noeviction:可以读可以删除,不能更新,这是默认的淘汰策略
  2. volatile-lru:尝试淘汰设置了过期时间的key,最少使用的key优先被淘汰
  3. volatile-ttl:尝试淘汰设置了过期时间的key,剩余过期时间最少的key优先被淘汰
  4. volatile-random:尝试淘汰设置了过期时间的key,随机淘汰key
  5. allkeys-lru:所有key最少使用的优先被淘汰
  6. allkeys-random:所有key随机淘汰
  7. volatile-lfu:尝试淘汰设置了过期时间的key,访问频次最少的key优先被淘汰
  8. 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 1incr 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

当节点有增加或者删减时,集群会自动将数据迁移,迁移完毕会通知。在迁移过程中,客户端仍会向原来的节点发送请求,如果有则正常处理,否则告诉客户端去目标节点查看数据是否存在。