Redis SLOWLOG 怎样读取并控制记录数量
来源:17golang原创
时间:2026-11-11 20:54:07 219浏览 收藏
我排查 Redis 延迟时,最容易先做错的一件事,就是把“这次想看几条”和“Redis 要保留几条”混成一个问题。SLOWLOG GET [count] 只控制本次读取的数量,slowlog-max-len 才控制慢日志容器最多保留多少条;SLOWLOG LEN 用来查看当前实际有多少条记录。
想快速查看最近 10 条,用SLOWLOG GET 10;想知道当前容器里有多少条,用SLOWLOG LEN;想改变保留容量,再调整slowlog-max-len。读取上限和保留上限是两条独立的线。
官方地址:https://redis.io/docs/latest/commands/slowlog/
下面按我实际排查时的顺序,把这三个动作串起来。示例只说明命令关系,不代表某个实例已经产生了同样的输出。
先把“读取数量”和“保留数量”拆开
Redis 慢日志会记录超过 slowlog-log-slower-than 阈值的命令执行时间,但这个执行时间不包含网络收发等 I/O。记录进入一个有最大长度的容器,最大长度由 slowlog-max-len 决定;容器达到上限后,新记录进入时会淘汰较早的记录。
而 SLOWLOG GET 的可选参数 count 只是读取窗口:省略时默认返回最近 10 条,传入正数时最多返回对应条数,传入 -1 时读取当前容器里所有现有记录。它不会把慢日志的容量改大。

只看最近几条时,用 SLOWLOG GET 的 count
日常排查通常先取一个小窗口,避免一次返回过多内容。下面的命令分别表示默认窗口、最近 5 条和全部现有记录:
# 默认返回最近 10 条,适合先快速判断是否有新慢命令 redis-cli SLOWLOG GET # 只读取最近 5 条,count 只影响本次响应的条数 redis-cli SLOWLOG GET 5 # 读取当前容器里已有的全部记录,不会改变 slowlog-max-len redis-cli SLOWLOG GET -1
SLOWLOG GET 返回的每条记录包含一个递增 ID、Unix 时间戳、执行耗时(微秒)、命令参数,以及客户端地址和客户端名称等信息。读取多条时,官方文档将结果描述为按时间顺序返回;排查时可以先按 ID 记住已经看过的边界,避免重复处理同一批记录。
如果只是想知道日志有没有装满,不需要先把明细全部取出来。先用 SLOWLOG LEN 看当前条数,往往更轻。
用 SLOWLOG LEN 判断当前还剩多少记录
SLOWLOG LEN 返回当前慢日志中的记录数,时间复杂度是 O(1)。它回答的是“现在容器里有多少条”,不是“从启动以来总共出现过多少条”。
# 先读取当前记录数,再决定是否扩大本次 GET 的窗口 redis-cli SLOWLOG LEN # 记录数较少时再读取全部现有条目 redis-cli SLOWLOG GET -1
| 命令或配置 | 回答的问题 | 是否改变保留容量 |
|---|---|---|
SLOWLOG GET 5 | 这次最多返回几条 | 否 |
SLOWLOG GET -1 | 把当前容器已有记录都读出来 | 否 |
SLOWLOG LEN | 当前容器里有几条 | 否 |
slowlog-max-len | 最多保留几条 | 是 |
真正控制记录数量,要调整 slowlog-max-len
如果问题是“慢日志留得太少,过一会儿就找不到早先的记录”,要看的不是 SLOWLOG GET 的参数,而是 slowlog-max-len。可以先读取当前值,再按实例容量和排查周期设置新的上限。
# 查看当前慢日志最大保留数量 redis-cli CONFIG GET slowlog-max-len # 临时调整运行中的实例;数值表示最多保留多少条慢日志 redis-cli CONFIG SET slowlog-max-len 256 # 调整后再次查看,确认配置查询返回的是目标值 redis-cli CONFIG GET slowlog-max-len
通过 CONFIG SET 改的是运行中的配置,不会自动改写磁盘上的 redis.conf。如果这个值要在重启后继续生效,还需要把对应配置同步到配置文件,或按部署方式执行配置重写。线上调整前还要考虑管理员权限和实例托管平台是否允许修改。
设置得更大并不等于能找回已经淘汰的旧记录;它只影响后续容器可保留的上限。设置得太小,则可能在你准备读取之前就被新的慢命令挤掉。

我会采用的日常排查顺序
在实际值班中,我通常不直接执行 SLOWLOG GET -1,而是先查数量、再取窗口、最后决定是否调整容量。这样既能快速看到现象,也不会因为一次读取太多记录而让排查本身变得嘈杂。
# 第一步:确认当前容器里是否有记录 redis-cli SLOWLOG LEN # 第二步:先拿最近 20 条,聚焦当前问题时间段 redis-cli SLOWLOG GET 20 # 第三步:只有在记录量可控时,才读取全部现有记录 redis-cli SLOWLOG GET -1 # 第四步:确认保留容量,避免把读取窗口误当成容量配置 redis-cli CONFIG GET slowlog-max-len
这里的“记录量可控”需要结合实例权限、客户端返回大小和排查目的判断。GET -1 适合一次性导出当前小容量日志,不适合把它当成长期采集方案;如果要持续监控,还应使用专门的监控和日志处理链路。
几个容易踩到的边界
把 GET 5 改成 GET 100,会不会让 Redis 多保留日志? 不会。它只改变这一次最多返回 100 条,容器里的最大保留量仍由 slowlog-max-len 决定。
GET -1 能看到所有历史慢命令吗? 不能。它只能读取当前容器仍然保留的全部记录,已经因容量淘汰或执行 SLOWLOG RESET 清掉的内容无法通过它恢复。
SLOWLOG LEN 返回 128,是不是说明系统只发生过 128 次慢命令? 不是。它只说明当前容器有 128 条,历史上更多的记录可能已经被新记录淘汰。
能不能用 RESET 代替控制容量? 不建议。SLOWLOG RESET 是清空现有记录的管理动作,不是设置最大保留数量的配置方式;执行前应确认确实不再需要当前排查证据。
最后留一张速查表
| 目标 | 使用方式 | 关键理解 |
|---|---|---|
| 先看最近记录 | SLOWLOG GET 10 | 默认思路是小窗口读取 |
| 查看当前条数 | SLOWLOG LEN | 只反映容器当前库存 |
| 读完当前库存 | SLOWLOG GET -1 | 不会扩大容量 |
| 控制最多保留几条 | CONFIG SET slowlog-max-len N | 影响后续淘汰边界 |
| 清除当前记录 | SLOWLOG RESET | 这是清空,不是调容量 |
如果只记一句话,就是:GET 的数字是“这次读多少”,LEN 是“现在有多少”,slowlog-max-len 是“最多留多少”。把三个概念分开后,Redis SLOWLOG 的读取和容量控制就不会再互相误导。
-
374 收藏
-
117 收藏
-
426 收藏
-
171 收藏
-
113 收藏
-
415 收藏
-
290 收藏
-
397 收藏
-
422 收藏
-
304 收藏
-
118 收藏
-
391 收藏
-
487 收藏
-
263 收藏
-
317 收藏
-
471 收藏
-
314 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习