FUNCTION 函数库是什么
Redis 7.0 引入 FUNCTION 引擎,把 Lua 脚本从「临时缓存」升级为「命名函数库」:用带 shebang 头的脚本注册一个库,库里的函数有名字,客户端用 FCALL 调用。库会随 RDB/AOF 一起持久化,可以 LIST 查看、DUMP 导出、RESTORE 恢复到另一个实例,ACL 也能单独控制。相比 EVAL 时代依赖脚本缓存(重启即丢、只能靠 SHA 调用),函数库更适合多团队长期维护。
基本信息
| 版本要求 | Redis 7.0 及以上 |
|---|---|
| 注册 | FUNCTION LOAD "#!lua name=库名\n..." |
| 调用 | FCALL 函数名 numkeys key... arg... |
| 查看与运维 | FUNCTION LIST / STATS / DUMP / RESTORE / KILL / FLUSH |
| 持久化 | 库随 RDB 与 AOF 一起保存,重启后自动加载 |
典型使用场景
- 原子复合操作:把需要多步完成且必须原子的逻辑写成函数,一次调用完成
- 多团队脚本治理:按团队或业务划分库名,避免脚本互相覆盖
- 脚本随数据迁移:用 DUMP 导出函数库、RESTORE 导到新实例,不依赖外部脚本管理系统
- 权限隔离:ACL 可以单独控制谁能调用函数、谁能管理函数库
- 从 EVAL 迁移:把脚本内容包一层注册函数,客户端调用从 EVALSHA 换成 FCALL
加载与调用
加载与调用
# 加载一个命名库(注意 shebang 头与内部换行的转义)
FUNCTION LOAD "#!lua name=mylib\nredis.register_function('myincr', function(keys, args) return redis.call('INCRBY', keys[1], args[1]) end)"
# 调用函数:函数名 + 键数量 + 键 + 参数
FCALL myincr 1 counter 5
# 查看与管理
FUNCTION LIST
FUNCTION STATS
FUNCTION DUMP # 导出函数库(可跨实例 RESTORE)
FUNCTION KILL # 终止运行中的只读函数
FUNCTION FLUSH ASYNC # 清空全部函数库(高危)与 EVAL 脚本对比
| 维度 | EVAL 脚本 | FUNCTION 函数库 |
|---|---|---|
| 持久化 | 脚本缓存不持久化,重启即失效 | 随数据文件持久化 |
| 命名 | 只能靠 SHA1 标识 | 库名与函数名可读可管理 |
| 迁移 | 需外部脚本系统分发 | DUMP / RESTORE 直接搬 |
| 权限 | ACL 控制 eval | 分别控制 fcall 与管理命令 |
| 兼容 | 全版本可用 | 需要 7.0 及以上 |
从脚本迁移的路径很直接:把脚本体改成 register_function 包一层,客户端把 EVALSHA 换成 FCALL 并传入键与参数。业务数据不需要变动。
FUNCTION FLUSH 会清空实例上全部函数库,且不区分团队:执行前确认没有其他业务仍在使用旧函数,生产操作应有明确的变更窗口。