SCRIPT KILL
redis-cli --eval get.lua k
CONFIG SET lua-time-limit 5000
SLOWLOG GET 10

业务报 BUSY Redis is busy running a script,整个实例的命令全部排队等。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,脚本里有次数不确定的循环或者大范围键匹配,执行期间 Redis 不处理其他命令,一旦超过 lua-time-limit 就开始对外回 BUSY。

这次卡住的地方就在「Redis Lua 脚本阻塞」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。

一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。

别只看报错的最后一行,往上看几行,真正的起因通常在上面。

处理上按这个顺序:先 SCRIPT KILL 掉只读脚本 写入的只能 NOSAVE;把脚本里的循环拆成有明确上界的批量操作方式;脚本加版本号 统一用 EVALSHA 调用。

改完只确认一件事:压测跑十分钟不再出现 BUSY,脚本平均耗时控制在十毫秒内。

作者 9823189