2、慢查询日志配置:slowlog-log-slower-than 与 slowlog-max-len 详解

慢查询日志是 Redis 性能诊断的第一道防线。配置不当会导致日志丢失或监控盲区,配置过度则可能引发内存膨胀。本章从两个核心参数入手,结合持久化策略与动态修改方法,帮助你建立一套可落地的慢查询配置体系。

2.1 slowlog-log-slower-than:定义“慢”的阈值

该参数以微秒(μs)为单位,指定一条命令执行时间超过多少微秒即被记录为慢查询。默认值为 10000(即 10ms)。

配置值 含义 典型场景
0 记录所有命令(包括极快命令) 调试阶段、全量追踪
-1 关闭慢查询日志 生产环境临时关闭(不推荐)
1000(1ms) 严格阈值 高 QPS 核心业务、延迟敏感场景
10000(10ms) 默认值 通用业务、混合负载
100000(100ms) 宽松阈值 批量任务、非实时分析
经验法则:将阈值设为业务平均延迟的 3~5 倍。例如平均响应 200μs,则阈值设为 1000μs(1ms)。避免设为 0 导致日志洪流,也避免设为 -1 导致盲区。

2.2 slowlog-max-len:控制日志队列容量

该参数指定慢查询日志队列的最大条目数。当队列满时,最旧的记录会被自动移除。默认值为 128。

  • 队列行为:先进先出(FIFO),新记录入队,旧记录出队。
  • 内存占用:每条记录约占用 1~2KB(含命令参数),128 条约 200KB,对 Redis 内存影响极小。
  • 常见配置范围:128 ~ 1024。超过 1024 后排查效率下降,建议配合外部日志系统。
注意:slowlog-max-len 只控制内存中的队列长度,不会自动持久化到磁盘。重启 Redis 后日志会全部丢失,必须配合持久化方案。
慢查询日志队列 FIFO 流转机制 慢查询日志队列 FIFO 流转机制 Redis 命令执行时间线(按时间顺序) 队列头部(最旧) 队列尾部(最新) 旧记录 记录 2 记录 3 记录 4 新记录 出队(丢弃) 入队(新记录) 队列满时,最旧记录自动出队,新记录始终入队

2.3 配置持久化:让慢查询日志不丢失

Redis 默认不将慢查询日志写入磁盘。重启后日志清空,这对问题复盘是致命缺陷。以下三种持久化方案按可靠性递增排列:

方案 实现方式 可靠性 性能影响
方案一:定时脚本导出 cron 定时执行 SLOWLOG GET N 并写入文件 中(可能丢失两次导出间的记录) 低
方案二:日志采集代理 使用 Filebeat / Logstash 采集 Redis 日志文件(需开启 logfile) 高 低
方案三:Redis 模块 / 外部存储 通过 Redis 模块写入 MySQL / Elasticsearch 极高 中(取决于写入频率)
推荐做法:生产环境使用方案二(日志采集代理),配合 slowlog-max-len 1024,每 10 秒采集一次。既保证日志不丢失,又避免频繁 IO 影响主流程。

2.4 动态修改:无需重启的配置变更

Redis 支持在运行时通过 CONFIG SET 命令修改慢查询参数,无需重启实例。修改后立即生效,但不会写入配置文件,重启后恢复默认值。

# 设置阈值为 5ms(5000 微秒)
127.0.0.1:6379> CONFIG SET slowlog-log-slower-than 5000
OK

# 设置队列长度为 500 条
127.0.0.1:6379> CONFIG SET slowlog-max-len 500
OK

# 查看当前配置
127.0.0.1:6379> CONFIG GET slowlog-log-slower-than
1) "slowlog-log-slower-than"
2) "5000"

127.0.0.1:6379> CONFIG GET slowlog-max-len
1) "slowlog-max-len"
2) "500"
持久化提醒:动态修改后,务必同步更新 redis.conf 文件中的对应参数,否则下次重启会丢失配置。建议使用配置管理工具(如 Ansible、Puppet)统一管理。
动态修改与持久化配置流程 动态修改与持久化配置流程 CONFIG SET 运行时立即生效 重启后丢失 同步更新 redis.conf 文件 重启后配置保留 最佳实践:CONFIG SET 后立即修改 redis.conf,确保重启不丢失

2.5 配置检查清单

部署或巡检时,按以下清单逐项确认:

  • 阈值合理性:是否根据业务平均延迟设定,而非直接使用默认值?
  • 队列长度:是否满足峰值期间的记录数量,避免关键慢查询被覆盖?
  • 持久化方案:是否已接入日志采集系统或定时导出脚本?
  • 配置一致性:运行时配置与 redis.conf 是否一致?
  • 监控告警:是否对慢查询数量设置告警阈值(如每分钟超过 10 条)?
快速验证:执行 SLOWLOG LEN 查看当前队列长度,执行 SLOWLOG GET 1 查看最近一条慢查询。如果返回为空,检查 slowlog-log-slower-than 是否设为 -1。