1慢查询
1.1生命周期

这是Redis命令从客户端到服务端的完整生命周期。
- 通过网络发送命令。
- 由于Redis是单线程,可以将Redis看做是一个队列,命令在执行之前都是在排队等待执行。
- 命令执行
- 返回结果给客户端
- 慢查询发生在第3阶段(命令执行)
- 慢查询是指命令的执行花费的时间,而不是在队列中排队等待执行的时间
- 客户端超时不一定是慢查询,但慢查询是客户端超时的一个可能因素
- 先进先出的固定长度队列,如果一个命令被列出慢查询的范围,它就会进入一个队列,本质上使用的一个列表实现,它就是一个先进先出的队列。
- 保存于内存中。
1.2两个配置
先进先出的固定长度队列,如果一个命令被列出慢查询的范围,它就会进入一个队列,本质上使用的一个列表实现,它就是一个先进先出的队列。
保存于内存中。
slowlog-max-len
slowlog-low-slower-than
- 慢查询阈值(单位:微妙):慢查询时间大于多少的时候将它列入慢查询的范围内。
- slowlog-log-slower-than=0:记录所有命令为慢查询
- slowlog-log-slower-than<0:不记录任何命令为慢查询
- 默认值
- config get slowlog-max-len = 128
- config get slowlow-low-slower-than = 10000
- 修改配置文件需要重启(不推荐)
- 动态配置(推荐)
- config set slowlog-max-len 1000
- config set slowlow-log-slower-than 1000
1.3三个命令
# 获取慢查询队列,n 为可选参数,为获取的慢查询条数
slowlow get [n]
# 获取慢查询队列长度
slowlog len
# 清空慢查询对垒
slowlog reset
1.4运维技巧
- slowlog-max-len 不要设置过大,默认10ms,通常设置1ms。
- slowlog-log-slower-than 不要设置过小,通常设置1000左右。
- 理解命令的生命周期。
- 定期持久化慢查询。
2Pipeline
2.1是什么?

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

作用
| 命令 | N个命令操作 | 1次pipeline(n个命令) |
|---|---|---|
| 时间 | n次网络+n次命令 | 1次网络+n次命令 |
| 数据量 | 1条命令 | n条命令 |
- Redis 的命令时间是微妙级别,因为命令时间很快,所以我们真正要控制实际上每次的网络时间,即我们需要控制每次的命令条数。
2.2与原生M操作对比
2.4使用技巧
- 注意每次pipeline携带的数据量
- pipeline每次只能作用在一个Redis节点上
- M操作和pipeline的区别
3发布订阅
3.1角色
- 发布者(Publisher)
- 订阅者(Subscriber)
- 频道(Channel)
3.2模型

类似生产者与消费者模型。生产者将消息发布到一个频道或通道中,消费者去订阅这个频道或通道就能获取对应的消息。
- 每个订阅者可以订阅多个频道。
- 新的订阅者无法收到订阅前的消息。
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. 消息队列
消息队列是一个抢的过程,发布者发送一条消息,就只有一个消息订阅者能够抢到这个消息。
4BitMap
4.1位图

对于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
类似下图的效果:

- 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算法,使用极小的空间完成独立数量统计。
- 本质还是字符串。