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,脚本平均耗时控制在十毫秒内。
