3. 慢查询日志机制详解:slowlog-log-slower-than 与 slowlog-max-len 配置原理

慢查询日志是 Redis 性能诊断的第一道防线。它不记录执行失败的命令,只记录那些执行耗时超过阈值的命令。理解其核心配置项 slowlog-log-slower-than 和 slowlog-max-len 的原理,是精准定位慢查询的前提。

3.1 核心配置项对比

配置项 单位 默认值 作用 典型设置
slowlog-log-slower-than 微秒 (μs) 10000 (10ms) 命令执行耗时超过此值即被记录 1000 (1ms) 或 5000 (5ms)
slowlog-max-len 条数 128 慢查询日志队列最多保存的记录数 1024 或 2048
关键理解:slowlog-log-slower-than 控制“哪些命令被记录”,slowlog-max-len 控制“记录多少条历史”。两者配合使用,缺一不可。

3.2 slowlog-log-slower-than:阈值设定原理

Redis 在执行每个命令前会记录开始时间,命令执行完毕后计算耗时。如果耗时 > slowlog-log-slower-than,则将该命令的 ID、时间戳、耗时、命令及参数、客户端地址等信息追加到慢查询日志链表头部。

  • 单位是微秒:1ms = 1000μs。默认 10000μs = 10ms。
  • 负值表示关闭:设为 -1 将禁用慢查询日志。
  • 零值表示记录所有命令:设为 0 会记录每个执行的命令(生产环境慎用,会大量消耗内存)。
  • 动态生效:可通过 CONFIG SET 在线修改,无需重启。
实战建议:对于延迟敏感业务,建议将阈值设为 1000μs (1ms)。对于批量操作或后台任务较多的场景,可设为 5000μs (5ms)。避免设得过低导致日志量过大。

3.3 slowlog-max-len:队列长度与淘汰机制

慢查询日志存储在内存中的一个固定长度链表中。当新记录加入时,如果链表长度超过 slowlog-max-len,最旧的记录会被自动淘汰。

  • 内存占用:每条记录约占用几百字节,128 条记录占用约 50KB 内存。
  • 淘汰策略:先进先出(FIFO),新记录插入头部,旧记录从尾部移除。
  • 动态调整:同样支持 CONFIG SET 在线修改。
避坑提示:不要将 slowlog-max-len 设得过大(如 100000),否则会占用大量内存且查看日志时返回数据量过大,导致网络开销增加。建议生产环境设为 1024~2048。

3.4 配置原理流程图

下图展示了 Redis 处理命令时慢查询日志的完整判定与记录流程:

慢查询日志判定与记录流程 慢查询日志判定与记录流程 客户端发送命令 记录开始时间 t_start 执行命令 计算耗时 = now - t_start 耗时 > slowlog-log-slower-than? 否 不记录 是 加入日志链表头部 链表长度 > slowlog-max-len? 否 保留全部 是 淘汰最旧记录

3.5 配置操作与查看命令

操作 命令/方式 说明
查看当前配置 CONFIG GET slowlog-log-slower-than
CONFIG GET slowlog-max-len
返回当前运行值
动态修改配置 CONFIG SET slowlog-log-slower-than 1000
CONFIG SET slowlog-max-len 1024
立即生效,无需重启
查看慢查询日志 SLOWLOG GET [N] 返回最近 N 条慢查询记录
查看日志长度 SLOWLOG LEN 返回当前日志队列中的记录数
清空日志 SLOWLOG RESET 清空所有慢查询记录

3.6 配置示例与效果分析

以下是一个典型的生产环境配置示例:

# 设置慢查询阈值为 2ms
CONFIG SET slowlog-log-slower-than 2000

# 设置日志队列长度为 1024 条
CONFIG SET slowlog-max-len 1024

# 查看当前配置是否生效
CONFIG GET slowlog-log-slower-than
# 返回: 1) "slowlog-log-slower-than"
#       2) "2000"

CONFIG GET slowlog-max-len
# 返回: 1) "slowlog-max-len"
#       2) "1024"
效果分析:设置阈值为 2ms 后,所有执行耗时超过 2ms 的命令都会被记录。队列长度 1024 条意味着最多保留最近 1024 条慢查询记录,超过后自动淘汰最旧的记录。这样既不会漏掉关键慢查询,也不会无限制占用内存。

3.7 常见配置误区

  • 误区一:阈值设得越小越好——设得过小(如 10μs)会导致大量正常命令被记录,日志队列迅速填满,真正需要关注的慢查询反而被过早淘汰。
  • 误区二:队列长度越大越好——设得过大(如 100000)会占用大量内存,且 SLOWLOG GET 返回数据量过大,增加网络传输开销。
  • 误区三:只配置阈值不关注队列长度——如果队列长度过小,慢查询记录会被快速淘汰,导致问题排查时找不到历史记录。
  • 误区四:修改配置后不持久化——CONFIG SET 仅修改运行期配置,重启后失效。需同时修改 redis.conf 文件或使用 CONFIG REWRITE 持久化。
最佳实践:先设置 slowlog-max-len 1024,再根据业务延迟要求逐步调低 slowlog-log-slower-than 阈值。每次调整后观察 1~2 小时,确保日志量在可控范围内。