我有一个由多个节点组成的 Redis 集群。我想在单个原子操作中更新 3 个不同的键。我的 Lua 脚本是这样的:
local u1 = redis.call('incrby', KEYS[1], ARGV[1])
local u2 = redis.call('incrby', KEYS[2], ARGV[1])
local u3 = redis.call('incrby', KEYS[3], ARGV[1])
我用以下方式解雇了它:
EVAL script 3 key1 key2 key3 arg
但我收到错误消息:
WARN Resp(AppErr CROSSSLOT Keys in request don't hash to the same slot)
无法进行上述操作,更新将失败。似乎我无法使用单个 Lua 脚本修改不同节点中的键。但根据文档:
所有 Redis 命令必须在执行之前进行分析,以确定该命令将操作哪些键。为了使 EVAL 成为 true,必须显式传递键。这在很多方面都很有用,尤其是确保 Redis 集群可以将您的请求转发到适当的集群节点。
请注意,此规则不是为了给用户提供滥用 Redis 单实例配置的机会而强制执行的,其代价是编写与 Redis 集群不兼容的脚本。
所以我认为只要遵循key传递规则,脚本应该兼容Redis Cluster。我想知道这里有什么问题,我应该怎么做才能更新单个脚本中的所有键。