*FCALL_RO 命令
调用 Redis 函数(只读版本)。与 FCALL 相同,但保证不执行任何写操作。Redis 7.0+ 引入,用于在只读副本上执行函数。
*语法
FCALL_RO function_name numkeys key [key ...] arg [arg ...]
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| function_name | String | 是 | 已加载的函数名称 |
| numkeys | Integer | 是 | key 参数数量 |
| key | String | 否 | key 参数 |
| arg | String | 否 | 普通参数 |
*返回值
返回函数执行的结果。
*时间复杂度
取决于函数内部逻辑。
*示例
# 在只读副本上执行只读函数
> FCALL_RO my_get 1 mykey
"value"
# 尝试写操作会报错
> FCALL_RO my_incr 1 counter 5
(error) ERR Write commands are not allowed from a read-only script
*常见错误
- 函数包含写命令:返回错误,函数中不能使用写操作。
*最佳实践
- 副本只读查询:在只读副本上执行复杂的只读函数,分担主节点压力。
*FAQ
Q: FCALL_RO 和 FCALL 有什么区别? A: FCALL_RO 只允许读命令,可在只读副本上执行;FCALL 允许读写命令,只能在主节点执行。
Q: 如何判断一个函数是只读的?
A: Redis 7.0+ 函数注册时可以标记 redis.register_function{name='func', flags={'no-writes'}, callback=func}。