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 在其中的判定位置:

慢查询判定与记录流程 客户端发送命令 Redis 单线程执行 耗时 > 阈值? 记录慢查询日志 返回结果给客户端 关键参数: slowlog-log-slower-than = 10000(10ms) slowlog-max-len = 128(最多保留 128 条记录)

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。这样既能捕捉到阻塞命令的异常延迟,又能保留足够的历史记录用于问题回溯。