*FCALL 命令
调用 Redis 函数(Redis Functions)。Redis 7.0+ 引入,替代部分 Lua EVAL 场景,函数可持久化存储。
*语法
FCALL function_name numkeys key [key ...] arg [arg ...]
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| function_name | String | 是 | 已加载的函数名称 |
| numkeys | Integer | 是 | key 参数数量 |
| key | String | 否 | key 参数 |
| arg | String | 否 | 普通参数 |
*返回值
返回函数执行的结果。
*时间复杂度
取决于函数内部逻辑。
*示例
# 1. 先加载函数(通过 FUNCTION LOAD)
> FUNCTION LOAD "#!lua name=mylib\nredis.register_function('my_incr', function(keys, args)\n local key = keys[1]\n local increment = tonumber(args[1])\n return redis.call('INCRBY', key, increment)\nend)"
mylib
# 2. 调用函数
> FCALL my_incr 1 counter 5
(integer) 5
> FCALL my_incr 1 counter 3
(integer) 8
*常见错误
- 函数未加载:返回
ERR Function not found。
*最佳实践
- 可持久化脚本:函数通过 FUNCTION LOAD 加载后,会持久化到 AOF/RDB,重启后自动恢复,无需每次传输脚本内容。
- 函数库组织:用 FUNCTION LOAD 加载整个库(library),包含多个相关函数。
*FAQ
Q: FCALL 和 EVAL 有什么区别? A: EVAL 每次传输完整 Lua 脚本;FCALL 调用已持久化的函数,只需传函数名。函数可复用,重启后自动恢复。
Q: 函数和 Lua 脚本有什么区别? A: 函数是持久化的 Lua 脚本,注册到 Redis 后一直可用。EVAL 的脚本是一次性的,除非用 EVALSHA 缓存。