*EVAL_RO 命令
执行只读 Lua 脚本。与 EVAL 相同,但保证脚本不执行任何写操作。Redis 7.0+ 引入,用于在只读副本(replica)上执行 Lua 脚本。
*语法
EVAL_RO script numkeys key [key ...] arg [arg ...]
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| script | String | 是 | Lua 脚本内容 |
| numkeys | Integer | 是 | key 参数数量 |
| key | String | 否 | key 参数 |
| arg | String | 否 | 普通参数 |
*返回值
返回 Lua 脚本的执行结果。
*时间复杂度
取决于脚本内部逻辑。
*示例
# 在只读副本上执行只读脚本
> EVAL_RO "return redis.call('GET', KEYS[1])" 1 mykey
"value"
# 尝试写操作会报错
> EVAL_RO "return redis.call('SET', KEYS[1], 'newvalue')" 1 mykey
(error) ERR Write commands are not allowed from a read-only script
*常见错误
- 脚本包含写命令:返回错误,脚本中不能使用任何写操作。
*最佳实践
- 副本只读查询:在只读副本上执行复杂的只读 Lua 脚本,分担主节点压力。
*FAQ
Q: EVAL_RO 和 EVAL 有什么区别? A: EVAL_RO 只允许读命令,可在只读副本上执行;EVAL 允许读写命令,只能在主节点执行。
Q: EVAL_RO 脚本可以调用哪些命令? A: 只读命令(GET、HGET、ZRANGE 等),不能调用 SET、DEL、INCR 等写命令。