function load 在集群中只作用于当前节点,不自动同步至其他节点,需手动逐节点加载并验证一致性。

FUNCTION LOAD 在集群中只作用于当前节点?
默认情况下,FUNCTION LOAD 只对执行命令的那个 Redis 节点生效,集群其他 master 或 replica 完全无感知。这不是 bug,是设计如此——Redis Functions 按 database 隔离,而 cluster 模式下每个 shard 是独立的 database 实例。
常见错误现象:FCALL 在节点 A 成功,切到节点 B 就报 ERR Unknown function;或者 FUNCTION LIST 在不同节点返回结果不一致。
- 必须显式对每个 master 节点执行加载:用
redis-cli --cluster call host:port FUNCTION LOAD ... - 不能依赖主从复制自动同步函数库——Functions 不走 replication stream,得靠人工或脚本逐节点推送
- 如果用了 Redis Cluster Proxy(如 redis-cli --cluster),它默认不转发
FUNCTION类命令,需确认代理版本是否支持(≥7.2) - 云服务(阿里云、腾讯云)集群版通常提供「全节点批量加载」控制台按钮,但底层仍是串行调用各节点,耗时较长,建议在低峰期操作
如何保证多节点函数逻辑完全一致?
手敲命令或手动 copy-paste 脚本极易出错,尤其当库中含多个函数、带注释或换行时,FUNCTION LOAD 对换行符和空格敏感,稍有差异就会导致 SHA 校验失败或解析报错。
实操建议:
- 把函数库写成单文件(如
mylib.lua),开头必须是#!lua name=mylib,结尾必须有redis.register_function(...) - 用
cat mylib.lua | redis-cli -x FUNCTION LOAD REPLACE加载,-x确保把 stdin 全部作为参数传入,避免 shell 解析干扰 - 加载后立刻在每个节点跑
FUNCTION LIST | grep -A 5 mylib,核对library_name、engine和functions数量是否一致 - 对关键函数做 smoke test:比如
FCALL myfunc 0 test,比对各节点返回值是否相同
集群模式下调用 FCALL 为什么报 keyspace 错误?
FCALL 不像 EVAL 那样能自动路由,它要求你明确列出所有涉及的 key,并由 Redis 根据 key 的 slot 分发到对应节点。如果漏列 key、列了不存在的 key、或 key 分布跨多个 slot,就会触发 MOVED 或 CROSSSLOT 错误。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
典型场景:
- 原
EVAL "return redis.call('GET', KEYS[1])" 1 foo改成FCALL get_key 1 foo—— 这里1表示后面有 1 个 key 参数,foo必须是真实存在的 key,且不能是 pattern(如foo*) - 函数内部若调用
redis.call('MGET', keys[1], keys[2]),则调用时必须写FCALL mget_keys 2 key1 key2,两个 key 必须落在同一 slot,否则报错 - 想跨 slot 操作?只能拆成多次
FCALL,或改用客户端分片逻辑,Functions 本身不解决跨 slot 问题
备份还原后 Functions 消失了怎么办?
RDB/AOF 确实会持久化 Functions,但有两个容易被忽略的前提:函数必须已成功加载进内存,且 Redis 启动时未加 --no-appendfsync-on-rewrite 或异常中断过 AOF rewrite。
最容易踩的坑:
- 只备份了 RDB,但没确认
save配置是否覆盖了 Functions 加载时间点——RDB 是快照,加载函数后没触发 save,还原就丢 - 用了 AOF,但
appendonly yes开启前已加载函数,这部分不会写入 AOF - 从 RDB 恢复新实例后,
FUNCTION LIST为空,但INFO persistence显示rdb_last_bgsave_status:ok—— 此时应检查 RDB 文件生成时间是否晚于函数加载时间 - 稳妥做法:每次上线新函数,都手动触发一次
SAVE,并用redis-cli --functions-rdb导出函数定义用于审计
Functions 在集群里不是“设一次就全局生效”的黑盒,它的加载、调用、持久化每一环都依赖显式控制。最常被忽略的是:没有验证每个节点的 FUNCTION LIST 输出一致性,以及调用时 key 列表与集群 slot 规则的硬绑定关系。










