*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

*常见错误

  1. 脚本包含写命令:返回错误,脚本中不能使用任何写操作。

*最佳实践

  1. 副本只读查询:在只读副本上执行复杂的只读 Lua 脚本,分担主节点压力。

*FAQ

Q: EVAL_RO 和 EVAL 有什么区别? A: EVAL_RO 只允许读命令,可在只读副本上执行;EVAL 允许读写命令,只能在主节点执行。

Q: EVAL_RO 脚本可以调用哪些命令? A: 只读命令(GET、HGET、ZRANGE 等),不能调用 SET、DEL、INCR 等写命令。