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

*常见错误

  1. NOSCRIPT 错误:Redis 重启或 SCRIPT FLUSH 后 SHA 失效,需重新 SCRIPT LOAD。

*最佳实践

  1. 脚本缓存策略:应用启动时 SCRIPT LOAD 常用脚本,运行时用 EVALSHA。NOSCRIPT 时回退到 EVAL
  2. 减少网络传输:长脚本用 EVALSHA 显著减少每次请求的数据量。

*FAQ

Q: EVALSHA 和 EVAL 性能有区别吗? A: 几乎无区别。EVALSHA 节省了脚本传输的带宽,但执行时两者完全一致。

Q: SHA 什么时候会失效? A: Redis 重启、SCRIPT FLUSH、复制到从节点(从节点需要重新 LOAD)时。