*Redis EVALSHA_RO 命令

EVALSHA_RO 以只读模式执行已通过 SCRIPT LOAD 加载的 Lua 脚本,保证脚本不会执行任何写操作。


*语法

EVALSHA_RO sha1 numkeys [key [key ...]] [arg [arg ...]]

*参数说明

参数 类型 必填 说明
sha1 String 脚本的 SHA1 哈希值
numkeys Integer 脚本使用的 key 参数数量
key String 脚本中通过 KEYS 数组访问的 key
arg String 脚本中通过 ARGV 数组访问的参数

*返回值

  • 取决于脚本执行结果,可为 String、Integer、Array 或 Nil

*时间复杂度

取决于脚本内部执行的操作复杂度


*示例

*加载并执行只读脚本

> SCRIPT LOAD "return redis.call('GET', KEYS[1])"
"a5e5e7381f2d5e5e5e5e5e5e5e5e5e5e5e5e5e5"
> EVALSHA_RO a5e5e7381f2d5e5e5e5e5e5e5e5e5e5e5e5e5e5 1 mykey
"hello"

*尝试执行写操作会失败

> EVALSHA_RO a5e5e7381f2d5e5e5e5e5e5e5e5e5e5e5e5e5e5 1 mykey
(error) ERR Write commands are not allowed from read-only scripts.

*常见错误

错误 原因 解决
NOSCRIPT No matching script 脚本未加载 先用 SCRIPT LOAD 加载
ERR Write commands are not allowed from read-only scripts 脚本包含写操作 确保脚本只读,或使用 EVALSHA

*最佳实践

  • 在只读副本(replica)或集群只读节点上执行查询脚本
  • 避免在只读脚本中意外调用写命令
  • 结合 SCRIPT LOAD 预加载脚本提高性能
  • 生产环境优先使用 EVALSHA 而非 EVAL 减少网络传输

*FAQ

Q1: EVALSHA_RO 和 EVALSHA 有什么区别? A: EVALSHA_RO 限制脚本只能执行读操作,可在只读节点安全执行。

Q2: 可以在主节点使用吗? A: 可以,但主节点通常用 EVALSHA 即可。

Q3: 脚本执行失败会回滚吗? A: Lua 脚本在 Redis 中默认原子执行,但 EVALSHA_RO 只读脚本不涉及写操作回滚。