*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 需满足集群的哈希槽要求。