登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  数据库 >  Redis

Redis 慢命令快照小工具:用 SLOWLOG 定位接口延迟

来源:17golang原创

时间:2026-06-29 11:29:34 501浏览 收藏

接口突然变慢时,很多团队第一反应是去看应用日志。但如果日志只显示某个 Redis 调用耗时偏高,却没有记录具体命令和 Key,排查会很被动。Redis 自带的 SLOWLOG 能记录超过阈值的慢命令,本篇用一个小工具把慢命令采样、解析和聚合串起来,生成一份可以直接贴进排障记录的 Markdown 快照报告。

目录

  • 项目目标:做一个 Redis 慢命令快照小工具
  • 环境准备:确认 SLOWLOG 阈值和样例数据
  • 核心代码:采集、解析和聚合慢命令
  • 本地运行:生成 Markdown 快照报告
  • 部署集成:接入巡检任务但控制频率
  • 验收:用样例慢命令确认报告可读

项目目标:做一个 Redis 慢命令快照小工具

这个工具只解决一个明确问题:当接口 P95 延迟升高时,快速拿到 Redis 慢命令样本,并把它们整理成“哪个命令最慢、哪个 Key 最可疑、慢了多少、下一步该看哪里”。它不代替 APM,也不长期高频扫描 Redis,只负责在排查窗口内生成一份可读快照。

最终报告应该至少包含四类信息:

  • 当前慢查询阈值,例如 slowlog-log-slower-than = 10000us
  • 采集到的慢命令数量、最高耗时、平均耗时。
  • 按命令类型聚合后的耗时分布,例如 HGETALLGETZRANGE
  • 可疑 Key 示例,方便回到业务代码确认数据结构和访问路径。
Redis 慢命令快照小工具目标:从接口延迟到 SLOWLOG 再到聚合报告
真实排障链路通常是接口延迟先暴露问题,再用 SLOWLOG 抓样本,最后把慢命令聚合成可读报告。

环境准备:确认 SLOWLOG 阈值和样例数据

先确认 Redis 能记录你关心的慢命令。slowlog-log-slower-than 的单位是微秒,设置为 10000 表示超过 10ms 的命令会进入慢日志。线上环境不要为了测试随意调得过低,否则慢日志会被普通请求快速刷满。

redis-cli CONFIG GET slowlog-log-slower-than
redis-cli SLOWLOG LEN
redis-cli SLOWLOG GET 10
redis-cli LATENCY LATEST

如果 SLOWLOG LEN 一直为 0,可能是阈值太高,也可能是 Redis 本身不是瓶颈。此时应先对照应用侧耗时、网络延迟和实例负载,不要把所有慢接口都归因到 Redis。

核心代码:采集、解析和聚合慢命令

下面用 Python 写一个最小版本。它从 Redis 读取最近的慢命令,过滤掉低于阈值的样本,再按命令类型聚合总耗时和平均耗时。为了让报告更容易回溯,代码会保留第一段 Key 线索。

from collections import Counter
from pathlib import Path
import argparse
import redis


def normalize_command(item):
    parts = item.get("command", b"").decode("utf-8", "replace").split()
    name = parts[0].upper() if parts else "UNKNOWN"
    key_hint = parts[1] if len(parts) > 1 else "-"
    return name, key_hint


def parse_rows(rows, threshold_us):
    parsed = []
    for row in rows:
        cost = int(row.get("duration", 0))
        if cost 

这里没有做复杂封装,原因是排障工具最重要的是结果稳定、输出直观。真正进入团队工具箱时,可以再补充连接超时、认证参数、实例名称、报告归档路径和告警链接。

本地运行:生成 Markdown 快照报告

安装依赖后运行脚本,先用较小的 limit 验证输出,再根据 Redis 实例慢日志长度扩大采样范围。阈值建议与实例配置保持一致,避免报告和 Redis 配置口径不一致。

python3 -m pip install redis
python3 slowlog_snapshot.py \
  --host 10.0.0.5 \
  --port 6379 \
  --limit 10 \
  --threshold-us 10000 \
  --out report.md

如果报告里某个命令总耗时明显偏高,下一步不要只盯 Redis 参数。比如 HGETALL cart:uid:8821 频繁出现时,更应该检查 Hash 字段数量是否膨胀;ZRANGE rank:list 0 5000 出现时,则要回到分页范围和业务访问路径。

部署集成:接入巡检任务但控制频率

这个工具适合接入低频巡检任务,例如接口延迟告警触发后运行一次,或发布前针对关键 Redis 实例运行一次。不要把它做成每秒轮询的常驻任务,因为慢日志本身是环形缓冲,过度读取不会增加诊断价值,反而会让排障动作变得噪声很大。

一个更稳妥的集成方式是:

  • 接口延迟告警触发后,人工或自动拉取一次慢命令快照。
  • 报告文件带上实例名、环境名、采集时间和业务接口名。
  • 只在报告里保留 Key 前缀或脱敏 Key,避免泄露用户标识。
  • 排障完成后记录处理动作,例如拆分大 Hash、限制范围查询、补充本地缓存。

验收:用样例慢命令确认报告可读

验收不是看脚本能否打印 [OK],而是看报告能否让接手排查的人马上判断方向。可以准备一组样例慢命令,确认报告能识别最高耗时、Top 命令、样例 Key 和聚合表格。

Redis 慢命令快照小工具验收:读取样本、解析耗时、分组统计并写入报告
验收时重点核对四件事:样本数量正确、耗时单位正确、分组统计正确、报告内容可读。

建议用下面这张检查表收尾:

  • SLOWLOG GET 返回的样本数和报告样本数一致。
  • 耗时单位保持微秒,报告中如需展示毫秒必须显式换算。
  • Top 命令和最高耗时样本能对应到原始慢日志。
  • 报告中没有敏感 Key 全量值,只保留排查所需线索。
  • 结论能落到下一步动作,例如改访问范围、拆字段、加缓存或调整数据结构。

排查 Redis 慢命令时,工具越贴近真实工作流越有价值。先把慢日志样本变成可读报告,再结合接口日志和业务代码定位访问模式,通常比单纯截图终端输出更容易形成闭环。

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>