*Redis SCRIPT EXISTS 命令

SCRIPT EXISTS 检查指定的 Lua 脚本 SHA1 摘要是否已加载到 Redis 脚本缓存中。


*语法

SCRIPT EXISTS sha1 [sha1 ...]

*参数说明

参数 类型 必填 说明
sha1 String 脚本的 SHA1 摘要,支持一次检查多个

*返回值

  • Integer 数组:每个 SHA1 对应一个元素,1 表示脚本存在,0 表示不存在

*时间复杂度

O(N),N 为检查的 SHA1 数量


*示例

*检查单个脚本

> SCRIPT LOAD "return redis.call('GET', KEYS[1])"
"6b1bf486c81c7fb1b5c5c7a9e8d5f5c5c5c5c5c5"
> SCRIPT EXISTS "6b1bf486c81c7fb1b5c5c7a9e8d5f5c5c5c5c5c5"
1) (integer) 1

*检查多个脚本

> SCRIPT EXISTS "6b1bf486c81c7fb1b5c5c7a9e8d5f5c5c5c5c5c5" "badsha1abc123" "anotherbadsha"
1) (integer) 1
2) (integer) 0
3) (integer) 0

*脚本不存在

> SCRIPT EXISTS "0000000000000000000000000000000000000000"
1) (integer) 0

*常见错误

错误 原因 解决
ERR wrong number of arguments 未提供 SHA1 至少提供一个 SHA1 参数
返回 0 脚本未加载或已被 FLUSH 用 SCRIPT LOAD 重新加载

*最佳实践

  • 运行前检查:执行 EVALSHA 前先 SCRIPT EXISTS 确认脚本已缓存,避免 NOSCRIPT 错误
  • 批量检查:一次检查多个 SHA1,减少 RTT
  • 应用启动检查:应用启动时批量 SCRIPT EXISTS,缺失的脚本用 SCRIPT LOAD 加载
  • 配合 Redis 连接池或客户端库自动重载机制使用

*FAQ

Q1: SCRIPT EXISTS 和直接执行 EVALSHA 有什么区别? A: EVALSHA 在脚本不存在时返回 NOSCRIPT 错误;SCRIPT EXISTS 预检查可避免运行时异常,适合在应用层做前置校验。

Q2: SHA1 区分大小写吗? A: 不区分。Redis 内部统一处理 SHA1 字符串。

Q3: 脚本被 SCRIPT FLUSH 后还能 EXISTS 吗? A: 不能。SCRIPT FLUSH 清空缓存后,所有已加载脚本的 SHA1 都会返回 0。