Redis 7.0 的 FUNCTION LOAD 命令自动将函数库写入 AOF/RDB 持久化文件,无需额外操作;必须以 #!lua name=xxx 开头声明,重复注册需加 REPLACE 参数,备份即备份整个数据目录。

FUNCTION LOAD 会自动写入 AOF/RDB,不需要额外操作
Redis 7.0 的 FUNCTION LOAD 命令本身就会把函数库内容作为数据库对象写入持久化文件(AOF 或 RDB),只要你的 Redis 实例开启了对应持久化方式,函数就天然具备落盘和复制能力。这和旧版 SCRIPT LOAD 完全不同——后者只缓存在内存里,重启即丢。
常见错误现象:SCRIPT LOAD 后在从节点执行 EVALSHA 报错 ERR NOSCRIPT No matching script;换成 FUNCTION LOAD 后,主从同步正常,FCALL 可直接调用。
验证是否生效,可检查:
- CONFIG GET appendonly 是否为 yes(AOF 开启)
- CONFIG GET save 是否有有效配置(RDB 触发条件满足)
- 执行 FUNCTION LIST 查看函数库是否出现在输出中,且重启后仍存在
必须显式指定 REPLACE 才能更新已注册的函数库
同一个函数库名(name=xxx)只能注册一次,重复执行 FUNCTION LOAD 会报错 ERR Library already exists。这不是 bug,是设计约束:函数库名全局唯一,用于标识和版本管理。
更新函数逻辑时,必须加 REPLACE 参数:
Redis 8.2.3 是一款安全优先的高性能键值存储系统。该版本紧急修复了可能引发远程代码执行(RCE)的高危漏洞(CVE-2025-62507),并解决了 HyperLogLog 及 Cuckoo Filter 等数据结构在特定场景下的崩溃问题。建议所有用户立即升级,以保障生产环境的系统稳定与数据安全。
FUNCTION LOAD REPLACE "#!lua name=mylib\nreturn 'hello'"
注意点:
- REPLACE 是强制覆盖,没有确认机制,上线前建议先在测试环境验证脚本逻辑
- 不带 REPLACE 的失败不会影响已有函数运行,但部署流程会中断
- 函数库名一旦被占用,无法通过 FUNCTION DELETE 删除(7.0 当前不支持删除,仅支持覆盖)
函数必须以 #!lua name=xxx 开头声明,否则加载失败
Redis Functions 不接受裸 Lua 代码,必须包含 shebang 风格的头部声明,指明引擎类型和库名。漏掉或格式错误会导致 FUNCTION LOAD 直接报错,例如:
FUNCTION LOAD "return 1"
→ 报错:ERR Invalid function header: missing #! prefix
正确写法示例:
FUNCTION LOAD "#!lua name=rate_limit\nredis.register_function('limit', function(keys, args) return 1 end)"关键要求:
- 必须以 #!lua 开头(目前仅支持 Lua 引擎)
- name=xxx 中的 xxx 不能含空格、斜杠、控制字符,建议只用字母数字和下划线
- 声明行之后才是实际 Lua 代码,中间不能有空行或注释干扰解析
备份函数库等同于备份整个 Redis 数据目录
因为函数库已作为数据对象写入 AOF/RDB,所以常规 Redis 备份手段完全适用:定期拷贝 dump.rdb、压缩归档 appendonly.aof、或使用 redis-cli --rdb 远程拉取快照。不需要单独导出函数。
但要注意两个易忽略点:
- 如果只启用 AOF,务必确认 appendfsync 策略不是 no,否则宕机前最后一秒的函数注册可能丢失
- 混合持久化(aof-use-rdb-preamble yes)下,函数信息只存在于 RDB 段,AOF 日志里不记录 FUNCTION LOAD 命令本身
生产建议:
- 使用 BGSAVE + WAIT 确保快照完成后再归档
- 在备份脚本末尾加一句 FUNCTION LIST | wc -l 校验函数数量是否与预期一致

















