1. 慢查询基础概念
1.1 什么是 Redis 慢查询
Redis 是单线程模型,所有命令按顺序排队执行。当某个命令执行耗时超过预设阈值时,该命令就会被记录为 慢查询。慢查询并不代表命令执行出错,而是指命令执行时间过长,可能阻塞后续请求,导致整体吞吐量下降。
核心认知: Redis 慢查询的判定依据是命令的执行耗时,而非网络传输或排队等待时间。只有实际执行阶段超过阈值的命令才会被记录。
慢查询的典型场景包括:
- 大 Key 操作:对包含数万个元素的 List、Set、Sorted Set 执行范围操作(如 LRANGE、SMEMBERS、ZRANGE)。
- 复杂聚合命令:SORT、SUNION、ZUNIONSTORE 等需要大量计算和临时内存的命令。
- 批量写入:一次性写入大量 Key 的 MSET、PIPELINE 操作。
- 阻塞命令:BLPOP、BRPOP 等阻塞式弹出命令在等待超时期间也会被计入慢查询。
1.2 慢查询日志的作用
慢查询日志是 Redis 内置的诊断工具,用于记录执行时间超过阈值的命令详情。其主要作用包括:
| 作用维度 | 具体说明 |
|---|---|
| 性能瓶颈定位 | 快速找出哪些命令是延迟的罪魁祸首,避免盲目优化。 |
| 容量规划依据 | 通过慢查询频率和耗时趋势,判断是否需要扩容或调整数据结构。 |
| 代码审计辅助 | 开发阶段开启慢查询日志,可提前发现不合理的命令使用模式。 |
| 故障排查入口 | 当 Redis 出现响应超时或 CPU 飙升时,慢查询日志是首要排查对象。 |
注意: 慢查询日志只记录命令的执行时间,不包含网络往返时间(RTT)和排队等待时间。因此,即使没有慢查询日志,客户端仍可能因网络延迟或连接池不足而感知到高延迟。
1.3 配置参数 slowlog-log-slower-than
slowlog-log-slower-than 是控制慢查询阈值的核心参数,单位是微秒(μs)。其配置规则如下:
| 参数值 | 含义 | 典型场景 |
|---|---|---|
0 |
记录所有命令 | 调试环境、性能压测时全量分析 |
-1 |
不记录任何慢查询 | 生产环境关闭日志以节省内存 |
10000(10ms) |
记录执行时间超过 10ms 的命令 | 对延迟敏感的在线业务 |
100000(100ms) |
记录执行时间超过 100ms 的命令 | 离线分析、批量任务场景 |
配置方式有两种:
# 方式一:运行时动态配置(无需重启)
CONFIG SET slowlog-log-slower-than 10000
# 方式二:写入 redis.conf 配置文件(重启后生效)
slowlog-log-slower-than 10000
推荐实践: 生产环境建议将阈值设为
10000(10ms)。对于消息队列场景,由于涉及 BRPOP/BLPOP 等阻塞命令,建议设为 5000(5ms)以更早发现阻塞异常。
1.4 慢查询日志的查看与管理
Redis 提供了 SLOWLOG 命令族来查看和管理慢查询日志:
| 命令 | 作用 |
|---|---|
SLOWLOG GET [N] |
获取最近 N 条慢查询记录(默认 10 条) |
SLOWLOG LEN |
查看当前慢查询日志总数 |
SLOWLOG RESET |
清空所有慢查询日志 |
每条慢查询记录包含以下字段:
1) (integer) 0 # 日志唯一 ID
2) (integer) 1712345678 # 命令执行时的 Unix 时间戳
3) (integer) 12000 # 命令执行耗时(微秒)
4) (integer) 3 # 命令参数个数
5) 1) "BRPOP" # 命令名称
2) "queue:orders" # 第一个参数
3) "5" # 第二个参数(超时时间)
1.5 慢查询流程与参数关系
下图展示了慢查询从命令执行到日志记录的完整流程,以及 slowlog-log-slower-than 在其中的判定位置:
1.6 慢查询日志的配置参数对比
除了 slowlog-log-slower-than,还有一个配套参数 slowlog-max-len 控制日志队列长度:
| 参数名 | 默认值 | 作用 | 建议值 |
|---|---|---|---|
slowlog-log-slower-than |
10000(10ms) | 命令执行耗时超过此值(微秒)即记录 | 生产环境 10000,消息队列场景 5000 |
slowlog-max-len |
128 | 慢查询日志队列最多保留的记录条数 | 256~512,避免日志丢失 |
配置组合建议: 在消息队列场景中,建议将
slowlog-log-slower-than 设为 5000(5ms),slowlog-max-len 设为 256。这样既能捕捉到阻塞命令的异常延迟,又能保留足够的历史记录用于问题回溯。