3. 慢查询日志机制:slowlog 的配置参数与分析方法

慢查询日志是 Redis 性能诊断的第一道防线。当某个命令的执行耗时超过预设阈值时,Redis 会将该命令的详细信息记录到内存中的慢查询日志队列。本章将深入解析 slowlog-log-slower-than 与 slowlog-max-len 两个核心配置参数,并演示如何通过命令行工具查看与分析慢查询日志,为后续的索引选择与调度优化提供数据基础。

3.1 核心配置参数详解

Redis 的慢查询日志机制由两个配置项控制,它们共同决定了“哪些命令被记录”以及“最多保留多少条记录”。

配置参数 默认值 作用 单位 / 说明
slowlog-log-slower-than 10000 命令执行时间阈值,超过该值的命令将被记录 微秒(μs),10000 μs = 10 ms
slowlog-max-len 128 慢查询日志队列的最大长度 条数,超出后最早的记录会被丢弃
生产环境建议: 将 slowlog-log-slower-than 设置为 1000~5000 μs(1~5 ms),以便捕获更多潜在慢查询;将 slowlog-max-len 提升至 1024 或更高,避免高频慢查询导致日志被快速覆盖。

3.1.1 配置修改方式

配置修改支持运行时动态调整与配置文件持久化两种方式:

  • 运行时修改(立即生效,重启后失效):
    # 设置阈值为 5 毫秒
    CONFIG SET slowlog-log-slower-than 5000
    
    # 设置队列长度为 1024 条
    CONFIG SET slowlog-max-len 1024
  • 配置文件修改(重启后持久化): 编辑 redis.conf 文件,找到对应配置项并修改:
    slowlog-log-slower-than 5000
    slowlog-max-len 1024
注意: 将 slowlog-log-slower-than 设置为负值(如 -1)会关闭慢查询日志;设置为 0 则会记录所有命令,生产环境中应避免此设置,以免日志队列被高频命令填满。

3.2 慢查询日志的内部结构

慢查询日志以链表形式存储在 Redis 内存中,每条记录包含以下关键字段:

字段 含义 示例值
唯一 ID 自增标识,从 0 开始 42
时间戳 命令执行时的 Unix 时间戳(秒) 1712345678
执行耗时 命令实际执行耗时(微秒) 12345
命令及参数 被记录的完整命令与参数数组 ["KEYS", "user:*"]
客户端地址 发起命令的客户端 IP 与端口 127.0.0.1:6379
客户端名称 通过 CLIENT SETNAME 设置的名称 my-app

3.3 查看与分析慢查询日志

Redis 提供了 SLOWLOG 命令族用于查看和管理慢查询日志,最常用的子命令包括 GET、LEN 和 RESET。

3.3.1 基本查看命令

  • 获取所有慢查询日志:
    SLOWLOG GET
    返回队列中的所有记录,按时间倒序排列(最新的在最前面)。
  • 获取指定数量的日志:
    SLOWLOG GET 10
    只返回最近的 10 条记录,避免输出过多数据。
  • 查看日志队列长度:
    SLOWLOG LEN
    返回当前队列中的记录总数。
  • 清空慢查询日志:
    SLOWLOG RESET
    清除所有已记录的慢查询,常用于诊断开始前重置状态。

3.3.2 日志输出格式解析

执行 SLOWLOG GET 2 的典型输出如下:

1) 1) (integer) 42
   2) (integer) 1712345678
   3) (integer) 12345
   4) 1) "KEYS"
      2) "user:*"
   5) "127.0.0.1:6379"
   6) "my-app"

2) 1) (integer) 41
   2) (integer) 1712345670
   3) (integer) 8765
   4) 1) "SORT"
      2) "cache:list"
      3) "BY"
      4) "weight_*"
   5) "10.0.0.1:54321"
   6) "batch-job"

每条记录是一个包含 6 个元素的数组,依次对应:ID、时间戳、耗时(微秒)、命令数组、客户端地址、客户端名称。

3.4 慢查询日志分析流程

以下 SVG 图展示了从配置到分析的完整闭环流程:

慢查询日志分析流程 配置阈值 slowlog-log-slower-than 命令执行 实时监控耗时 超时? 记录慢查询 写入内存队列 查看日志 SLOWLOG GET 分析优化 索引/命令/数据结构 调整配置 动态 CONFIG SET 闭环反馈 分析结果驱动配置优化

3.5 实战分析技巧

3.5.1 快速定位高频慢命令

通过脚本批量分析 SLOWLOG GET 的输出,可以快速识别出最耗时的命令模式:

# 使用 redis-cli 结合 awk 统计耗时最高的命令
redis-cli SLOWLOG GET 100 | awk '
  /^4\)/ { cmd=$0 }
  /^3\)/ { time=$2; if(time>10000) print time, cmd }
' | sort -rn | head -10

3.5.2 关联客户端与业务

利用客户端名称字段(第 6 个元素)可以快速定位慢查询的来源:

# 按客户端名称分组统计慢查询数量
redis-cli SLOWLOG GET 200 | grep -E "^6\)" | sort | uniq -c | sort -rn

3.5.3 时间窗口分析

将时间戳转换为可读时间,分析慢查询的分布规律:

# 将时间戳转换为本地时间并排序
redis-cli SLOWLOG GET 500 | awk '
  /^2\)/ { printf strftime("%Y-%m-%d %H:%M:%S", $2) " " }
  /^3\)/ { print $2 " μs" }
' | head -20
关键指标: 当慢查询日志中出现大量 KEYS、SORT、LREM、ZRANGEBYSCORE 等 O(N) 或 O(log N+M) 命令时,应优先考虑通过索引优化或数据结构改造来降低耗时。

3.6 慢查询日志的局限性

虽然慢查询日志是重要的诊断工具,但在实际使用中需要注意以下限制:

  • 仅记录执行耗时: 不包含网络延迟、排队等待时间、客户端处理时间。
  • 内存队列易丢失: 队列满时旧记录会被覆盖,建议结合外部日志系统持久化。
  • 无法记录阻塞操作: 如 BRPOP 等阻塞命令,其等待时间不计入执行耗时。
  • 高并发场景下性能影响: 设置 slowlog-log-slower-than 为 0 会显著增加内存与 CPU 开销。