redis无官方命令列出所有缓存lua脚本,script exists仅支持单个或多个指定sha1的布尔验证;生产环境需在客户端自行维护脚本sha1注册表,配合script load预加载与evalsha调用,并实现noscript时自动fallback至eval重载。

SCRIPT EXISTS 只能查单个 SHA1,没法列出全部脚本
Redis 没有类似 KEYS * 那样的命令直接列出所有已缓存脚本。SCRIPT EXISTS 必须传入一个或多个明确的 SHA1 值,返回对应布尔数组——它是个“验证器”,不是“枚举器”。你如果连有哪些 SHA1 都不知道,这个命令就无从下手。
真正能列出所有缓存脚本的方法只有 SCRIPT DEBUG
Redis 本身不暴露脚本列表,但你可以用调试模式间接获取:
- 启动
redis-cli时加--ldb参数会进入 Lua 调试器,但它需要正在执行的脚本,不能用于静态查看 - 更实用的是:Redis 服务端内存里确实存着
lua_scripts字典,但它是内部结构,不对外提供读取接口 - 所以结论很实在:没有官方命令能 dump 出当前所有缓存脚本的 SHA1 或内容
生产环境推荐的替代方案:自己维护脚本注册表
既然 Redis 不给,就得在客户端补上这层管理。常见做法是把脚本加载和 SHA1 映射关系记在外部(比如配置中心、本地 Map、或 Redis 自己的一个 hash 键):
- 首次启动时用
SCRIPT LOAD加载所有预设脚本,并把返回的 SHA1 存下来 - 每次调用前先查本地缓存的 SHA1,再发
EVALSHA;失败则 fallback 到EVAL并重新SCRIPT LOAD - 避免依赖
SCRIPT FLUSH后自动恢复——它不会触发重载,得你自己做 - 注意:不同 Redis 实例(尤其是集群分片)缓存是独立的,注册表必须按实例维度维护
SCRIPT FLUSH 后怎么快速确认脚本是否真没了?
最直接的办法是批量验证几个关键脚本的 SHA1:
- 用
SCRIPT EXISTS <sha1_1><sha1_2><sha1_3></sha1_3></sha1_2></sha1_1>一次查多个 - 返回全是
0就说明缓存清空了(别只查一个,防止单个脚本本来就没加载过) - 如果返回混着
1和0,说明部分脚本还在,可能是部分节点没刷干净,或某些客户端提前 reload 了 - 别信
INFO server里的字段——它不统计脚本数量,lua_script相关指标在 7.0 之前根本不存在
SCRIPT FLUSH 或主从切换,NOSCRIPT 就是板上钉钉。











