*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 只读脚本不涉及写操作回滚。