Logo
活死人の行知路

四、Redis其他功能


📅 | 📝 230 字
#redis #DBA

1慢查询

1.1生命周期

这是Redis命令从客户端到服务端的完整生命周期。

  1. 通过网络发送命令。
  2. 由于Redis是单线程,可以将Redis看做是一个队列,命令在执行之前都是在排队等待执行。
  3. 命令执行
  4. 返回结果给客户端
  • 慢查询发生在第3阶段(命令执行)
  • 慢查询是指命令的执行花费的时间,而不是在队列中排队等待执行的时间
  • 客户端超时不一定是慢查询,但慢查询是客户端超时的一个可能因素
  • 先进先出的固定长度队列,如果一个命令被列出慢查询的范围,它就会进入一个队列,本质上使用的一个列表实现,它就是一个先进先出的队列。
  • 保存于内存中。

1.2两个配置

  • 先进先出的固定长度队列,如果一个命令被列出慢查询的范围,它就会进入一个队列,本质上使用的一个列表实现,它就是一个先进先出的队列。

  • 保存于内存中。

  • slowlog-max-len

  • slowlog-low-slower-than

  1. 慢查询阈值(单位:微妙):慢查询时间大于多少的时候将它列入慢查询的范围内。
  2. slowlog-log-slower-than=0:记录所有命令为慢查询
  3. slowlog-log-slower-than<0:不记录任何命令为慢查询
  • 默认值
  1. config get slowlog-max-len = 128
  2. config get slowlow-low-slower-than = 10000
  • 修改配置文件需要重启(不推荐)
  • 动态配置(推荐)
  1. config set slowlog-max-len 1000
  2. config set slowlow-log-slower-than 1000

1.3三个命令

# 获取慢查询队列,n 为可选参数,为获取的慢查询条数
slowlow get [n]

# 获取慢查询队列长度
slowlog len

# 清空慢查询对垒
slowlog reset

1.4运维技巧

  1. slowlog-max-len 不要设置过大,默认10ms,通常设置1ms。
  2. slowlog-log-slower-than 不要设置过小,通常设置1000左右。
  3. 理解命令的生命周期。
  4. 定期持久化慢查询。

2Pipeline

2.1是什么?

alt text

  • 命令时间非常快,但网络则不同受各种因素影响(比如内外网、跨机房地区等)
  • Pipeline 可以将一次批量命令批量打包,然后在服务端批量计算,然后按顺序返回给客户端

alt text

作用

命令N个命令操作1次pipeline(n个命令)
时间n次网络+n次命令1次网络+n次命令
数据量1条命令n条命令
  • Redis 的命令时间是微妙级别,因为命令时间很快,所以我们真正要控制实际上每次的网络时间,即我们需要控制每次的命令条数。

2.2与原生M操作对比

2.4使用技巧

  1. 注意每次pipeline携带的数据量
  2. pipeline每次只能作用在一个Redis节点上
  3. M操作和pipeline的区别

3发布订阅

3.1角色

  • 发布者(Publisher)
  • 订阅者(Subscriber)
  • 频道(Channel)

3.2模型

alt text

类似生产者与消费者模型。生产者将消息发布到一个频道或通道中,消费者去订阅这个频道或通道就能获取对应的消息。

  • 每个订阅者可以订阅多个频道。
  • 新的订阅者无法收到订阅前的消息。

3.3命令

  • publish
  • subscribe
  • unsubscribe
# 向 apple:tv 这个频道发送一个消息,返回的结果为订阅者数量
publish apple:tv "hello world"

# 如果频道没有订阅者则返回0
publish apple:auto "hello redis"

# 订阅者可以订阅一个或多个频道
subscribe apple:tv

# 取消订阅,可以取消订阅一个或多个频道
unsubscribe apple:tv

3.4发布订阅 VS. 消息队列

alt text 消息队列是一个抢的过程,发布者发送一条消息,就只有一个消息订阅者能够抢到这个消息。


4BitMap

4.1位图

alt text

对于Redis来说是可以直接操作位的。

127.0.0.1:6379> set hello big
OK
127.0.0.1:6379> getbit hello 0
(integer) 0
127.0.0.1:6379> getbit hello 1
(integer) 1

127.0.0.1:6379> get hello
"big"
127.0.0.1:6379> setbit hello 7 1
(integer) 0
127.0.0.1:6379> get hello
"cig"

4.2命令

  • setbit key offset value:给位图指定索引设置值,即把key中的第几位设置为value。
127.0.0.1:6379> setbit unique:users:2026-06-30 0 1
(integer) 0
127.0.0.1:6379> setbit unique:users:2026-06-30 5 1
(integer) 0
127.0.0.1:6379> setbit unique:users:2026-06-30 11 1
(integer) 0
127.0.0.1:6379> setbit unique:users:2026-06-30 15 1
(integer) 0
127.0.0.1:6379> setbit unique:users:2026-06-30 19 1
(integer) 0

类似下图的效果: alt text

  • getbit key offset:获取位图指定索引的值
127.0.0.1:6379> getbit unique:users:2026-06-30 8
(integer) 0
127.0.0.1:6379> getbit unique:users:2026-06-30 19
(integer) 1
  • bitcount key [start end]:获取位图指定范围(start到end,单位为字节,如果不指定则获取全部)位值为1的个数。
  • bitop op destkey key [key…]:做多个Bitmap的and(交集)、or(并集)、not(非)、xor(异或)操作并将结果保存在destkey中。

5HyperLogLog

5.1新的数据结构?

  • 基于HyperLogLog算法,使用极小的空间完成独立数量统计。
  • 本质还是字符串。

5.2命令

6GEO