Redis其他特性和功能

慢查询

定义

慢查询日志帮助开发和运维人员定位系统存在的慢操作。慢查询日志就是系统在命令执行前后计算每条命令的执行时间,当超过预设阀值,就将这条命令的相关信息(慢查询ID,发生时间戳,耗时,命令的详细信息)记录下来,可将其持久化到磁盘中供开发人员分析。

客户端请求生命周期

慢查询是一个先进先出的队列,该队列固定长度,保存在内存中。若一条命令在第三阶段的执行过程中被判断为慢查询,则会进行该队列。

慢查询配置

  1. slowlog-log-slower-than: 命令是否是慢查询的界定条件(阈值),单位微秒,例如超过10毫秒就认为该命令是慢查询,= 0 是代表记录所有命令,< 0 不记录任何命令,默认:10000。
  2. slowlog-max-len: 慢查询列表的固定长度,默认:128
  3. slowlog list: 指明有哪些慢查询
  4. 参数配置:
    • 修改配置文件
    • 动态配置:config set slowlog-max-len 1000

慢查询命令

  1. slowlog get [n] # 获取慢查询队列, n 指明获取几个慢查询记录
  2. slowlog len # 获取慢查询队列长度
  3. slowlog reset # 清空慢查询队列

注意事项

  1. slowlog-max-len:线上环境建议调大慢查询日志的列表,记录慢查询日志时Redis会对长命令做截断操作,并不会占用大量内存。增大慢查询列表可以减缓慢查询被剔除出列表的可能性。例如线上可以设置为1000以上。
  2. slowlog-log-lower-than:需要根据redis的并发量调整该值。由于redis采用单线程,对于高流量的场景,如果执行命令的时间在1毫秒以上,那么redis最多可支撑OPS(每秒操作次数)不到1000,因此高OPS场景的redis建议设置为1毫秒。
  3. 慢查询日志是一个先进先出队列,慢查询较多的情况下,可能会丢失部分慢查询命令,可以定期执行slow get命令将慢查询日志持久化到其他存储中,然后制作可视化界面查询。

pipeline

定义

利用pipeline可以一次从发送多条命令(打包),在服务端执行之后,在把结果一次性返回,节省了命令/结果在网络中的传输时间。若没有使用pipeline,n次命令的操作,要额外花费n-1网络时间,因为redis的命令执行都是微秒级别,所以网络时间通常是瓶颈所在。

使用

Pipeline pipeline = jedis.pipelined();
pipeline.set("product","computer");
pipeline.set("producttwo","microwave");
pipeline.syncAndReturnAll();

注意事项

  1. 注意每次pipeline携带数据量
  2. pipeline每次只能作用在一个Redis节点上
  3. M操作(mset)是原子操作,pipeline命令非原子操作。

发布订阅

发布订阅模型

API

  1. publish channel message # 发布者向对应频道发布消息, 返回订阅者数量
    e.g., publish sohu:tv “hello!”
  2. subscribe [channel] # 订阅一个或多个频道
  3. unsubscribe [channel] # 取消订阅一个或多个频道
  4. psubscribe [pattern…] # 订阅一个或多个符合给定模式的频道
    e.g., psubscribe it* # 将会订阅以it开头的频道
  5. punsubscribe [pattern…] # 取消订阅一个或多个符合给定模式的频道
  6. pubsub channels # 列出至少有一个订阅者的频道
  7. pubsub numsub [channels…] # 列出给定频道的订阅者数量

与消息队列的区别

发布订阅时,所以订阅者都可以收到发布者的信息,而消息队列是消息订阅者从消息队列中取消息,不保证每个消息订阅者都可以得到消息。

位图

定义

位图(也称为位数组,位向量等)是紧凑存储位的数组数据结构。redis提供了对位的操作。

特征

位数组是自动扩展的,如果超出现有内容范围,它会自动将位数组进行零扩充。

API

  1. setbit key offset value # 给位图指定偏移量设置值
  2. getbit key offset # 得到指定偏移量的值
  3. bitcount key [start end] # 获取位图指定范围(start - end, 单位为字节, 不指定则代表获取全部)位值位1的个数
  4. bitop op destkey key[key…] # 对多个位图进行 and (交集),or(并集),not(非),xor(异或)操作,并把结果保存在 destkey 中
  5. bitpos key targetBit [start] [end] #计算位图指定范围(start-end, 单位为字节, 不指定则代表获取全部)第一个值等于 targetBit 的偏移量

注意事项

  1. Type = String, 最大512MB
  2. 注意setbit时的偏移量,可能损耗大
  3. 活跃用户统计/用户的签到等等应用都有奇效

HyperLogLog

定义

基于HyperLogLog算法,极小空间完成独立数量(基数)统计。本质还是字符串。
基数统计:一个集合(注意:这里集合的含义是 Object 的聚合,可以包含重复元素)中不重复元素的个数。例如集合 {1,2,3,1,2},它有5个元素,但它的基数/Distinct 数为3。

API

  1. pfadd key element [element… # 向hyperloglog添加元素
  2. pfcount key [key… # 计算hyperloglog的独立总数
  3. pfmerge destkey sourcekey[sourcekey… # 合并多个hyperloglog

注意事项

  1. 存在错误率 - 0.81%
  2. 不能取出单条数据
  3. 鉴于 HyperLogLog 不保存数据内容的特性,所以,它只适用于一些特定的场景。例如计算日活、月活数据等等

GEO - redis 3.2+支持

定义

GEO: 地理信息定位,存储经纬度,计算两地距离,范围计算等。redis的geo实现采用数据结构为zset

API

  1. geoadd key longitude latitude member [longitude latitude member… # 增加地理位置信息
    e.g., geoadd city:location 116.28 39.55 bejing
  2. geopos key member [member… # 获取地理位置信息
  3. geolist key member1 member2 [unit] # 获取两个地理位置的距离 unit: m, km, mi, ft
  4. georadius
  5. zrem key member # edis的geo实现采用数据结构为 zset,遂可以使用zset API进行删除

参考资料

[1] https://coding.imooc.com/class/151.html

Author: HB
Link: http://www.huangbin.fun/Redis其他特性和功能.html
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.