function load必须以#!lua name=xxx开头且仅第一行,禁用全局redis表和大写命令;库名仅支持字母、数字、下划线;重名需加replace;末尾须调用redis.register_function()。

FUNCTION LOAD 必须带 #!lua name=xxx 头,且不能有空行或 BOM;函数库名只允许字母、数字和下划线;不加 REPLACE 时重名会报错。
FUNCTION LOAD 命令必须严格遵循格式规范
直接把老 EVAL 脚本内容丢给 FUNCTION LOAD,90% 会失败。最常见错误是:attempt to call a nil value (global 'redis')——因为 Functions 禁用了全局 redis 表,也不认大写命令(如 redis.CALL)。
- 第一行且仅第一行,必须是
#!lua name=mylib,前后不能有空行、注释、BOM 字符 - 库名中不能含点号(
anti.pen❌),只能用下划线(anti_pen✅) - 推荐显式加
version=1,比如#!lua name=mylib version=1,便于后续版本管理 - 脚本末尾必须调用
redis.register_function(),否则FUNCTION LOAD成功但FUNCTION LIST查不到函数
函数库更新必须用 REPLACE,不能增量修改
Redis 不支持对已有库增删单个函数,整个库是原子单元。想加一个函数或改一行逻辑,都得整库替换。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 首次加载用
FUNCTION LOAD "...",再次更新必须加REPLACE:FUNCTION LOAD REPLACE "..." - 没加
REPLACE却重名,报错ERR Library already exists - 即使只改了一个函数的实现,也要重新
register_function所有函数——否则旧函数会消失 - 集群环境下,每个 master 节点都得单独执行一遍
FUNCTION LOAD REPLACE,不自动同步
FUNCTION LIST 和 FUNCTION STATS 是日常运维核心命令
光靠 FCALL 成功不代表函数健康。真正上线前必须查这两项。
-
FUNCTION LIST看是否所有节点返回一致的library_name、engine和functions数量 -
FUNCTION LIST library mylib可精确查看某库下所有函数名和 flags -
FUNCTION STATS显示各函数的调用次数、错误率、平均耗时——高延迟或高频 error 就得立刻下线检查 - 注意:
FUNCTION STATS的统计不跨节点,集群里要逐节点查
集群中 FCALL 报 ERR Unknown function 或 MOVED 的根本原因
这两个错误看似不同,根源其实一样:函数没在目标节点上注册,或 key 路由规则没对齐。
-
ERR Unknown function:当前节点没执行过FUNCTION LOAD,或者加载时名字拼错(比如大小写、下划线漏了) -
MOVED或CROSSSLOT:不是函数问题,是FCALL传参时keys列少了、列错、或跨 slot —— 函数本身无法自动路由 -
FCALL mylib.myfunc 2 user:123 user:456中的2是 keys 数量,必须和实际 key 个数完全一致,且这些 key 必须落在同一 slot - 调试时可用
CLUSTER KEYSLOT user:123确认 slot,避免误判为函数加载失败
最容易被忽略的是换行符和空格:用 cat mylib.lua | redis-cli -x FUNCTION LOAD REPLACE 加载,比手敲或复制粘贴更可靠;-x 确保 stdin 全部作为参数传入,绕过 shell 对换行和引号的干扰。










