*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

*常见错误

  1. 函数未加载:返回 ERR Function not found

*最佳实践

  1. 可持久化脚本:函数通过 FUNCTION LOAD 加载后,会持久化到 AOF/RDB,重启后自动恢复,无需每次传输脚本内容。
  2. 函数库组织:用 FUNCTION LOAD 加载整个库(library),包含多个相关函数。

*FAQ

Q: FCALL 和 EVAL 有什么区别? A: EVAL 每次传输完整 Lua 脚本;FCALL 调用已持久化的函数,只需传函数名。函数可复用,重启后自动恢复。

Q: 函数和 Lua 脚本有什么区别? A: 函数是持久化的 Lua 脚本,注册到 Redis 后一直可用。EVAL 的脚本是一次性的,除非用 EVALSHA 缓存。