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