能,但默认只返回最近128条,且时间戳为秒级、无客户端ip、参数被截断;需用redis-cli slowlog get n | jq转结构化csv/json才便于聚类分析。

redis-cli --slowlog get 能直接查到慢查询吗?
能,但默认只返回最近 128 条(由 slowlog-max-len 控制),且不带时间戳精度、客户端 IP 或完整命令参数。直接执行 redis-cli --slowlog get 会返回类似 [1684572390, "GET", ["user:1001"], 12456] 的数组:第一项是 Unix 秒级时间戳,第二项是命令名,第三项是参数列表(已截断),第四项是执行耗时(微秒)。注意:这个时间戳没有毫秒,无法精确定位到某次具体请求。
怎么把 slowlog 导出成可分析的结构化日志?
Redis 自身不提供导出为 CSV/JSON 的内置命令,得靠外部处理。推荐用管道组合:
redis-cli --slowlog get 1000 | jq -r '.[] | "\(.[-2]|join(" ")) \(.[-1]) \(.|[0])"' | sort -k3nr | head -20
说明:jq 提取命令字符串、耗时、时间戳;sort -k3nr 按第三列(耗时)倒序排;head -20 取最慢的 20 条。关键点:
-
slowlog get后面跟数字表示最多返回条数,建议设大些(如 1000),避免漏掉高频低耗时但累积影响大的慢操作 - 如果 Redis 没启用
slowlog-log-slower-than(单位微秒),默认是 10000(即 10ms),低于该值不会记录——很多线上问题其实卡在 3–8ms 的HGETALL或LRANGE上,得调低阈值 - 参数列表(如
["user:1001"])是 Redis 序列化后的结果,不含空格或引号,不能直接还原原始命令全貌;若命令含二进制数据,这里会显示为省略或乱码
为什么 slowlog 显示耗时 5000 微秒,但应用层测出来是 80ms?
这是常见误解。slowlog 记录的是「命令在 Redis 单线程中实际执行时间」,不包括网络往返、客户端序列化/反序列化、连接池等待、重试延迟等。真实链路耗时 = slowlog 时间 + 网络 RTT × 2 + 客户端开销。排查时要分层看:
Redis 8.2.3 是一款安全优先的高性能键值存储系统。该版本紧急修复了可能引发远程代码执行(RCE)的高危漏洞(CVE-2025-62507),并解决了 HyperLogLog 及 Cuckoo Filter 等数据结构在特定场景下的崩溃问题。建议所有用户立即升级,以保障生产环境的系统稳定与数据安全。
- 先确认 slowlog 里有没有持续 >5ms 的
KEYS、FLUSHDB、大SCAN或未加 LIMIT 的SMEMBERS—— 这类是真慢 - 如果 slowlog 全部
- Redis 6+ 支持
CLIENT LIST查当前连接状态,配合client-repl-buffer-limit和timeout配置,能辅助判断是否被长连接拖累
如何实时监控 slowlog 增长并告警?
不能依赖定时轮询 slowlog get,因为可能刚查完就清空(slowlog reset 或自动覆盖)。更可靠的方式是监听 SLOWLOG 频道(Redis 7.0+ 才支持):
redis-cli --csv subscribe __keyspace@0__:slowlog
但注意:这不是标准方案,Redis 并不发布 slowlog 事件。真正可行的是用 redis-cli --stat 观察 instantaneous_ops_per_sec 波动,再结合 slowlog len 做差值监控。例如每 5 秒跑一次:
redis-cli slowlog len | xargs -I{} sh -c 'echo $(date +%s) {}; sleep 5'
如果 slowlog len 在短时间内突增(比如 30 秒内从 10 跳到 120),说明有批量慢操作正在发生。这时候再抓 slowlog get 200 分析,比盲扫有效得多。
最容易被忽略的一点:slowlog 是内存中的环形缓冲区,Redis 重启即丢失;线上必须配合 MONITOR(慎用,性能杀器)或代理层(如 RedisInsight、Redislabs 的 Redis Cloud)做持久化采样。单纯靠命令行,只能看到“此刻还剩什么”,看不到“过去发生了什么”。










