SCRIPT KILL 只能终止未执行写命令的脚本一旦调用 redis.call(set) 等写操作脚本变为 UNKILLABLE因 Redis 为保障原子性禁止中途终止否则可能导致数据不一致。SCRIPT KILL 为什么有时不生效直接结论SCRIPT KILL 只能终止「尚未执行任何写命令」的脚本一旦脚本调用了 redis.call(set, ...)、redis.call(del, ...) 等修改数据的命令它就变成 UNKILLABLE —— 这不是 bug是 Redis 为保障原子性做的硬性限制。现象执行 SCRIPT KILL 后返回 (error) UNKILLABLE Sorry the script already executed write commands...原因Redis 要求 Lua 脚本“全有或全无”中途杀掉可能留下半写状态比如库存扣了一半、订单建了没发券这比挂起更危险验证方法用 redis-cli --stat 或监控 instantaneous_ops_per_sec若持续为 0 且客户端卡住大概率已进入不可杀状态死循环脚本卡住后还能做什么当 SCRIPT KILL 失效你只剩两个真实可行的选项没有中间路线SHUTDOWN NOSAVE最常用也最激进。它会立即终止 Redis 进程且不触发 RDB/AOF 持久化意味着上一次快照之后的所有写入全部丢失重启进程非优雅比如 kill -9 pid效果等同于 SHUTDOWN NOSAVE但绕过了 Redis 自身的清理逻辑风险略高等待脚本自然结束别信——只要循环里没 break 或超时检查它就不会停而 Redis 不会主动中断已写入的脚本怎么避免下次再被死循环拖垮预防远比抢救重要。关键不是“怎么杀”而是“不让它活过 5 秒” 灵办AI 免费一键快速抠图支持下载高清图片