【发布时间】:2016-11-09 02:59:54
【问题描述】:
我有一个由多个节点组成的 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,键必须显式传递。这在很多方面都很有用, 但特别是要确保 Redis Cluster 可以将您的请求转发到 合适的集群节点。
请注意,此规则不是按顺序执行的 为用户提供滥用Redis单机的机会 实例配置,以编写不兼容的脚本为代价 使用 Redis 集群。
所以我认为只要遵循key传递规则,脚本应该兼容Redis Cluster。我想知道这里有什么问题,我应该怎么做才能更新单个脚本中的所有键。
【问题讨论】:
标签: redis redis-cluster