*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。