slowlog仅记录执行时间≥slowlog-log-slower-than的命令,不记录被lua-time-limit中断的脚本;其command字段截断且无中断标记,仅能显示部分命令如eval开头内容,无法还原完整脚本或确认是否中断。

Redis Lua脚本执行超时后,SLOWLOG里能查到什么
Redis 的 EVAL/EVALSHA 脚本一旦执行时间超过 lua-time-limit(默认 5000 毫秒),会被强制中断,但**不会报错返回给客户端**——它会静默失败,而脚本实际效果可能已部分生效。此时唯一可靠的追溯手段就是 SLOWLOG,但它记录的不是“被中断的脚本”,而是“执行时间过长的命令”,包括那些**成功跑完但耗时超标**的 Lua 调用。
关键点:SLOWLOG GET 返回的每条记录中,command 字段只保留前 128 字节(可由 slowlog-max-len 和 slowlog-log-slower-than 控制),且**不包含完整的 Lua 脚本内容,也不标记是否被中断**。你看到的可能是截断的 EVAL "return redis.call..." ...,无法直接还原原始脚本逻辑。
-
SLOWLOG只记录命令执行耗时 ≥slowlog-log-slower-than(单位微秒)的条目,和lua-time-limit是两套独立阈值 - 被
lua-time-limit中断的脚本,不会进入 SLOWLOG;只有“慢但没超限”的脚本才可能留下指纹 - 若想捕获中断事件,必须依赖 Redis 日志(
redis-server启动时加--loglevel verbose或配置loglevel verbose),日志中会出现Script attempted to execute a command that would exceed the memory limit, or script execution time exceeded lua-time-limit类似提示
如何从 SLOWLOG 提取可识别的脚本指纹
靠肉眼在 command 字段里翻找不可靠,尤其当多个脚本都以 return redis.call("GET", KEYS[1]) 开头时。你需要提前埋点,让每条记录自带可检索标识。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 在 Lua 脚本第一行插入注释,例如
-- fingerprint:cart_update_v2,Redis 不会执行注释,但SLOWLOG会原样记录(只要没被截断) - 调用时显式传入带含义的
KEYS或ARGV,比如用ARGV[1] == "fingerprint=order_expire",再在脚本里做空操作(if ARGV[1] then end),确保该字符串出现在SLOWLOG的command字段中 - 避免使用
EVALSHA直接调用——它在SLOWLOG中只显示EVALSHA xxxxx,完全丢失上下文;如需复用,先用SCRIPT LOAD加载并记录 SHA1,再人工维护 SHA1 → 脚本名映射表
lua-time-limit 设置不当的典型后果
这个配置项在 redis.conf 中,影响所有 Lua 脚本的硬性执行上限。设太小会导致合法脚本被误杀;设太大则掩盖真实性能问题,还可能阻塞主线程。
- 默认 5000ms 对多数简单脚本足够,但若脚本内含循环遍历大集合(如
SCAN+ 多次HGETALL),或调用外部服务(不推荐!但有人真这么干),很容易触达 - 调高
lua-time-limit并不能解决根本问题:Redis 是单线程,脚本卡住期间所有命令排队,PING都会延迟,监控系统可能误判为实例宕机 - 线上环境建议保持默认或略增(如 7000),同时配合
slowlog-log-slower-than 1000000(1 秒)捕获潜在慢脚本,形成双层观测
真正有效的监控组合方案
单靠 SLOWLOG 查指纹是被动、滞后、信息残缺的。生产环境必须搭配其他手段:
- 在应用层对
EVAL/EVALSHA调用打日志,记录完整脚本 SHA1、KEYS/ARGV、开始/结束时间戳——这是最准的一手数据 - 用
INFO commandstats定期采集cmdstat_eval和cmdstat_evalsha的calls和usec_per_call,看平均耗时趋势,比SLOWLOG更早发现劣化 - 对高频 Lua 脚本做预编译检查:用
redis-cli --eval在测试环境模拟压测,观察TIME命令返回的实际耗时,别等上线才踩坑
脚本中断本身不抛异常,SLOWLOG 也只留残影——真正的监控难点从来不在“怎么查”,而在“怎么让问题在造成影响前就浮现出来”。










