*Redis FUNCTION LOAD 命令
FUNCTION LOAD 用于将函数库加载到 Redis 中。
*语法
FUNCTION LOAD [REPLACE] <payload>
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| REPLACE | Flag | 否 | 如果库已存在则替换 |
| payload | String | 是 | 函数库的 Lua 代码 |
*返回值
- Bulk String:加载的库名称
- Error:语法错误、库已存在(未带 REPLACE)等
*时间复杂度
O(N),其中 N 是函数库代码的大小
*示例
*基本用法
> FUNCTION LOAD "#!lua name=mylib\nredis.register_function('myfunc', function(keys, args) return 'hello' end)"
mylib
*替换已有库
> FUNCTION LOAD "#!lua name=mylib\nredis.register_function('myfunc', function(keys, args) return 'hello' end)"
mylib
> FUNCTION LOAD REPLACE "#!lua name=mylib\nredis.register_function('myfunc', function(keys, args) return 'world' end)"
mylib
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| ERR Library 'mylib' already exists | 库已存在且未带 REPLACE | 添加 REPLACE 选项或先删除旧库 |
| ERR Error compiling script | Lua 语法错误 | 检查代码语法 |
| ERR Function already exists | 函数名已存在 | 使用不同的函数名或 REPLACE |
*最佳实践
- 场景:部署函数库、更新函数逻辑、扩展 Redis 功能
- 建议将函数代码存储在版本控制系统中
- 生产环境更新时建议先使用 REPLACE 测试,再切换流量
- 注意:函数库名称必须唯一,函数名在库内也必须唯一
*FAQ
Q1: FUNCTION LOAD 和 EVAL 有什么区别? A: FUNCTION LOAD 加载持久化的函数库,函数可以重复调用;EVAL 是临时执行 Lua 脚本,不会持久化。
Q2: 加载的函数在重启后还在吗? A: 在。Redis Functions 会持久化到 RDB 和 AOF 中,重启后自动恢复。
Q3: 可以加载多个函数库吗? A: 可以,只要库名不同。每个库可以包含多个函数。