script flush 清除 redis 服务端所有已缓存的 lua 脚本(即通过 script load 加载并生成 sha1 的脚本),返回 ok,不清理正在运行的脚本、eval 直接执行未缓存的脚本、aof/rdb 中的脚本,也不影响 lua-time-limit 配置。

SCRIPT FLUSH 会清空 Redis 服务端所有已缓存的 Lua 脚本(即通过 SCRIPT LOAD 加载并生成 SHA1 校验和的脚本),但它不会影响正在运行的脚本,也不会清除通过 EVAL 直接执行但未缓存的脚本——因为那些根本没进缓存。
什么时候必须用 SCRIPT FLUSH
你遇到以下任一情况时,SCRIPT FLUSH 是最直接有效的清理手段:
- 上线新版本脚本后,旧脚本的 SHA1 校验和仍被客户端误引用,导致
EVALSHA执行失败并报错(error) NOSCRIPT No matching script. Please use EVAL. - 调试阶段反复
SCRIPT LOAD同一逻辑不同变体,字典里积压了大量冗余 SHA1 条目,想彻底重置缓存状态 - 迁移或压测前需确保服务端无任何预加载脚本,排除缓存干扰
SCRIPT FLUSH 的实际执行与验证
它没有参数,执行极简单,但要注意两点:一是它不可逆,二是它只作用于当前 Redis 实例(主从不同步)。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 连接后直接运行:
SCRIPT FLUSH,返回OK即成功 - 立刻用
SCRIPT EXISTS验证是否清空,例如:SCRIPT EXISTS abc123一定返回(integer) 0(即使之前存在) - 若使用集群模式,需对每个 master 节点单独执行;Redis 7+ 的 Functions 不受此命令影响
示例:
127.0.0.1:6379> SCRIPT LOAD "return 1" "6b1bf481991a307a581c5b8f3e9a5d7b7b7b7b7b" 127.0.0.1:6379> SCRIPT EXISTS "6b1bf481991a307a581c5b8f3e9a5d7b7b7b7b7b" (integer) 1 127.0.0.1:6379> SCRIPT FLUSH OK 127.0.0.1:6379> SCRIPT EXISTS "6b1bf481991a307a581c5b8f3e9a5d7b7b7b7b7b" (integer) 0
容易忽略的关键限制
SCRIPT FLUSH 看似简单,但有三个硬性边界常被低估:
- 它不阻塞客户端,但会触发 Lua 环境重建:旧环境关闭、新环境初始化,期间若有脚本正执行(尤其超时未结束的),
SCRIPT KILL可能失效,需先等其自然退出 - 它不清理
lua-time-limit配置项的运行时状态,超时阈值仍按原配置生效 - 在 AOF 或 RDB 持久化场景下,该命令本身不会写入 AOF 文件,也不会触发 RDB 快照——也就是说,重启后脚本缓存仍是空的,这点和
FLUSHDB不同
真正要小心的不是怎么执行它,而是执行之后——你的客户端是否还持有已失效的 SHA1,并在下一次请求中盲目调用 EVALSHA。这种错误不会报语法错,只会静默失败。










