*Redis EVALSHA 命令
执行已缓存的 Lua 脚本(通过 SHA1 摘要)。避免每次传输完整脚本内容。
*语法
EVALSHA sha1 numkeys key [key ...] arg [arg ...]
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| sha1 | String | 是 | 脚本的 SHA1 摘要 |
| numkeys | Integer | 是 | key 参数数量 |
| key | String | 否 | key 参数 |
| arg | String | 否 | 普通参数 |
*返回值
同 EVAL,返回脚本的执行结果。
*时间复杂度
同 EVAL。
*示例
# 1. 先加载脚本获取 SHA
> SCRIPT LOAD "return redis.call('GET', KEYS[1])"
"6b1bf486c81c7fb1b5c5c7a9e8d5f5c5c5c5c5c5"
# 2. 用 SHA 执行
> EVALSHA "6b1bf486c81c7fb1b5c5c7a9e8d5f5c5c5c5c5c5" 1 mykey
"value"
# SHA 不存在
> EVALSHA "badsha" 1 mykey
(error) NOSCRIPT No matching script. Please use EVAL.
*常见错误
- NOSCRIPT 错误:Redis 重启或 SCRIPT FLUSH 后 SHA 失效,需重新 SCRIPT LOAD。
*最佳实践
*FAQ
Q: EVALSHA 和 EVAL 性能有区别吗? A: 几乎无区别。EVALSHA 节省了脚本传输的带宽,但执行时两者完全一致。
Q: SHA 什么时候会失效? A: Redis 重启、SCRIPT FLUSH、复制到从节点(从节点需要重新 LOAD)时。