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

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 时读取当前容器里所有现有记录。它不会把慢日志的容量改大。

Redis SLOWLOG GET、SLOWLOG LEN 与 slowlog-max-len 控制关系的静态说明图
图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。如果这个值要在重启后继续生效,还需要把对应配置同步到配置文件,或按部署方式执行配置重写。线上调整前还要考虑管理员权限和实例托管平台是否允许修改。

设置得更大并不等于能找回已经淘汰的旧记录;它只影响后续容器可保留的上限。设置得太小,则可能在你准备读取之前就被新的慢命令挤掉。

Redis SLOWLOG 单条记录字段与读取上限和保留上限的静态说明图
图2:单条慢日志字段与 GET 读取上限、slowlog-max-len 保留上限的静态说明图,不是 Redis 控制台截图。

我会采用的日常排查顺序

在实际值班中,我通常不直接执行 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 的读取和容量控制就不会再互相误导。

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