Redis-高级功能
标签:Redis

Redis高级功能

1. 慢查询

1.1 生命周期

注意:

  1. 慢查询发生在第三阶段,只是命令执行本身慢
  2. 客户端超时不一定是慢查询,因为上面所示的这四个过程都有可能产生客户端变慢,但慢查询是客户端超时的一个可能因素。

1.2 slowlog-max-len

  1. 先进先出队列,如果一条命令在第三步的执行过程中被列入慢查询的范围内,他就会进入一个FIFO队列

  2. 队列时固定长度的

  3. 保存在内存内,不会持久化,随重启而消失。

    1.3 slowlog-log-slower-than

    1. 慢查询阈值(单位:微秒)
    2. slowlog-log-slower-than=0 ,记录所有命令
    3. slowlog-log-slower-than<0 ,不记录任何命令

1.4 配置方法

  1. 默认值
    1. config get slowlog-mx-len=128
    2. config get slowlog-len-slower-than=10000
  2. 修改配置文件重启
  3. 动态配置
    1. config setslowlog-mx-len=128
    2. config set slowlog-len-slower-than=10000

1.5 慢查询命令

  1. slowlog get [n] :获取慢查询队列
  2. slowlog len :获取慢查询队列长度
  3. slowlog reset :清空慢查询队列

1.6 运维经验

  1. slowlog-max-len 不要设置过大,默认10ms,通常设置1ms,根据qps决定

  2. slowlog-log-slower-than 不要设置过小,通常设置在1000左右

  3. 定期持久化慢查询

2. pipeline

2.1 1次网络命令通信模型

上面的1次网络时间包括1和3,如果是n次的话,就是n次网络时间和n次命令时间。

2.2 流水线

现将命令打包,在服务端进行批量计算,最后将结果按顺序返回。

对比:

命令 N个命令操作 1次pipeline(n个命令)
时间 n次网络+n次命令 1次网络+n次命令
数据量 1次命令 n条命令

注意:

  1. Redis的命令时间是微秒级别的,执行速度很快的
  2. pipeline每次条数要控制(网络)

2.3 其他

pipeline不是原子的操作,每次执行相当于pipeline的子命令。

使用建议:

  1. 注意每次pipeline携带数据量
  2. pipeline每次只能作用在一个Redis节点上

3. 发布订阅

角色:

  1. 发布者(publisher)
  2. 订阅者(subscriber)
  3. 频道(channel)

当然每个消费者也可以订阅多个频道:

但是Redis没办法做消息堆积这个功能。

3.1 相关API

发布命令:

publish channel message : 返回订阅者个数

订阅命令:

subscribe [channel] #一个或多个

取消订阅:

unscbscribe [channel] #一个或多个

其他API:

psubscribe [pattern...] #订阅模式

punsubscribe [pattern...] #退订指定的模式

pubsub channels #列出至少有一个订阅者的频道

pubsub numsub [channel...] #列出给定频道的订阅者数量

pubsub numpat #列出被订阅模式的数量

4. Bitmap

setbit key offset value :给位图指定索引设置值

可以单独设置一个位,则中间没有的将会自动补0。

getbit key offset :获取位图指定索引的值

bitcount key [start end]:获取位图指定范围(start到end,单位为字节,如果不指定就是获取全部)位值为1的个数

bitop op destkey key [key...]:做多个Bitmap的and交,or并,not非,xor异或操作并将结果保存在destkey中。

bitops key targetBit [start] [end] :计算位图指定范围(start到end,单位为字节,如果不指定就是获取全部)第一个偏移量对应的值等于targetBit的位置

4.1 独立用户统计

但如果真实的用户较少情况下,则可能相反(还是要开1亿的长度的bitmap,但实际只有10万个用户):

4.2 注意

  1. bitmap实际还是String类型,type=string 最大可以存512MB,较大的时候可以进行拆分
  2. 注意setbit时的偏移量,可能有较大耗时
  3. 位图不是绝对好

5. HyperLogLog

  1. 基于HyperLogLog算法:极小空间完成独立数量统计
  2. 本质还是字符串

API:

pfadd key element [element ...] : 向hyperloglog添加元素

pfcount key [key ...] :计算hyperloglog的独立总数

pfmerge destkey sourcekey [sourcekey ...]:合并多个hyperloglog

注意:

  1. 它存在错误率:0.81%
  2. 它不能取出单条数据

6. GEO

GEO(地理信息定位):存储经纬度,计算两地距离,范围计算等。

geo key longitude latitude member [longitude latitude member...] :增加地理位置信息

geopos key member [member... ]: 获取地理位置信息

geodist key memberi member2 [unit] :获取两个地理位置的距离,unit:m,km,mi(英里),ft(尺)

注意:

  1. since 3.2+
  2. type geoKey = zset
  3. 没有删除API: zrem key member
  • 6 min read

CONTRIBUTORS


  • 6 min read