首页/数据/数据库速查/FUNCTION 函数库(7.0,替代脚本管理)
Redis 命令96 条

FUNCTION 函数库(7.0,替代脚本管理)

Redis 7.0 的 FUNCTION 引擎:用 shebang 头加载命名 Lua 库,FCALL 调用;库随 RDB/AOF 持久化、可 LIST/DUMP/RESTORE,比易失的脚本缓存更适合多团队脚本治理。

数据库速查数据更新于 2026-10-13

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 会清空实例上全部函数库,且不区分团队:执行前确认没有其他业务仍在使用旧函数,生产操作应有明确的变更窗口。

易错点

  • shebang 头格式写错:库加载直接失败,报错信息偏底层,先对照文档确认首行格式与命名规则
  • 在低版本实例上使用:报未知命令,客户端库可能需要升级,跨版本部署要提前确认
  • 函数库管理没有归属约定:多个团队共用一个实例时随意 FLUSH 或覆盖库名,导致他人函数消失
  • 运行时错误不处理:函数内部异常会中断执行,涉及写入的逻辑要注意残留的半完成状态
  • 把复杂计算塞进函数:函数在单线程内执行,长时间运行的函数会阻塞整个实例,复杂任务应在业务侧完成

数据来源与参考

  • Redis 官方文档: FUNCTION LOAD
  • Redis 官方文档: FCALL

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌