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 处理命令时慢查询日志的完整判定与记录流程:
3.5 配置操作与查看命令
| 操作 | 命令/方式 | 说明 |
|---|---|---|
| 查看当前配置 | CONFIG GET slowlog-log-slower-thanCONFIG GET slowlog-max-len |
返回当前运行值 |
| 动态修改配置 | CONFIG SET slowlog-log-slower-than 1000CONFIG 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 小时,确保日志量在可控范围内。