*Redis FUNCTION 命令

FUNCTION 是 Redis 7.0+ 引入的函数库管理命令,用于加载、删除、调用和管理服务器端函数(Redis Functions)。


*语法

FUNCTION LOAD [REPLACE] engine-name library-name [library-description] "<code>"
FUNCTION DELETE library-name
FUNCTION LIST [LIBRARYNAME library-name] [WITHCODE]
FUNCTION CALL function-name [key [key ...]] [arg [arg ...]]
FUNCTION DUMP
FUNCTION RESTORE payload [FLUSH | APPEND]
FUNCTION KILL
FUNCTION FLUSH [ASYNC | SYNC]
FUNCTION STATS

*参数说明

参数 类型 必填 说明
engine-name String 脚本引擎,如 lua
library-name String 函数库名称
library-description String 函数库描述
code String 函数代码内容
REPLACE Flag 替换同名库
key String 函数使用的 key
arg String 传递给函数的参数

*返回值

  • FUNCTION LOAD: 库名称(String)
  • FUNCTION DELETE: OK
  • FUNCTION LIST: 函数库信息数组
  • FUNCTION CALL: 取决于函数返回值
  • FUNCTION DUMP: 序列化的函数库数据
  • FUNCTION RESTORE: OK
  • FUNCTION KILL: OK
  • FUNCTION FLUSH: OK
  • FUNCTION STATS: 函数执行统计信息

*时间复杂度

  • FUNCTION LOAD: O(N),N 为代码长度
  • FUNCTION DELETE: O(1) - FUNCTION LIST: O(N),N 为函数库数量
  • FUNCTION CALL: 取决于函数内部复杂度

*示例

*加载函数库

> FUNCTION LOAD lua mylib "#!lua name=mylib
redis.register_function('hello', function(keys, args)
  return 'Hello, ' .. args[1]
end)"
"mylib"

*调用函数

> FUNCTION CALL hello 0 world
"Hello, world"

*列出函数库

> FUNCTION LIST
1) 1) "library_name"
   2) "mylib"
   3) "engine"
   4) "LUA"
   5) "functions"
   6) 1) 1) "name"
         2) "hello"
         3) "description"
         4) (nil)

*删除函数库

> FUNCTION DELETE mylib
OK

*导出和恢复

> FUNCTION DUMP
"\x04..."
> FUNCTION RESTORE "\x04..." APPEND
OK

*常见错误

错误 原因 解决
ERR Function already exists 函数名已存在 使用 REPLACE 或先 DELETE
ERR Library not found 库不存在 确认库名称正确
ERR Error compiling script 脚本语法错误 检查代码语法

*最佳实践

  • 函数库作为持久化的服务器端逻辑,比 Lua 脚本更稳定
  • 使用 FUNCTION DUMP / RESTORE 在集群间同步函数库
  • 生产环境函数需经过充分测试后再加载
  • 函数名应具有描述性,避免冲突
  • 利用 REPLACE 进行函数库更新

*FAQ

Q1: Functions 和 EVAL 脚本有什么区别? A: Functions 持久化存储在服务器端,重启后保留;EVAL 脚本每次需发送完整代码。

Q2: 支持哪些引擎? A: Redis 7.0+ 默认支持 Lua 引擎,未来可能支持更多。

Q3: 函数可以在集群中使用吗? A: 可以,但函数访问的 key 需满足集群的哈希槽要求。