Redis lua 脚本:我在脚本中混合 KEYS 和生成的密钥的尝试在集群时是否有效(如果我小心的话)?

Redis lua script: will my attempt to mix KEYS and generated keys within the script work when clustering (if I'm careful)?

我已经搜索过这个问题的答案,但每个问题都没有真正抓住我的问题。

我正在使用 StackExchange.Redis 作为 C# 中的 redis 客户端来维护 redis 缓存中的状态,该缓存将来有可能被集群化。

我正在尝试使用 lua 脚本来自动管理数据集 - 集合的组合内容和其他关联的键被组合起来构建状态信息(我目前不能依赖 RedisJSON 来可用于复杂数据)。

为了实现这一点,我有一个 lua 脚本,它在一个集合中搜索信息,并使用结果动态构建一个键,然后添加信息来维护其他键。

由于 Stackexchange.Redis 会使用传递给脚本的 KEYS 自动找到正确的节点来执行脚本,我想知道我是否真的可以将两者混合以确保我的脚本是集群的-安全。

我已经安排了我的密钥,以便脚本中的所有密钥都在同一个哈希槽中:

{MyServiceName:id}

例如:

redis.call SADD '{MyServiceName:1}:namespaces', @namespace
redis.call SADD '{MyServiceName:1}:namespace:' .. @ns .. 'providers', @providerId

请注意,这是一个简化的示例 - 我可能会将此处的所有密钥作为 KEYS 传递,但这会复制密钥和数据

我所做的如下:

(PerformOperation.lua)
-- Accept a dummy key that is in the same hash slot - this will ensure we are on the correct cluster node?
local idKey = @idKey

-- Do the rest of the stuff with only keys of the same hash slot
redis.call SADD '{MyServiceName:' .. @id .. '}:namespaces', @namespace

...
(C# caller)
this.performOperationScript= this.LoadScript("PerformOperation.lua");

...

// The idKey defines the hash slot, for example {MyServiceName:1}
var result = await this.performOperationScript.EvaluateAsync(db, new { idKey= $"{{MyServiceName:{id}}}", id });

这是否会实现我希望的效果,即 Stackexchange.Redis 会根据 idKey 将脚本转发到正确的集群节点,然后只要我在脚本中生成的任何密钥都在相同的哈希槽,一切正常吗?

提前致谢!

Redis在使用lua时使用KEYS来计算slot。因此,如果您只有一个 IDKey 作为键,它将全部映射到正确的节点。

你的密钥是动态的,你使用散列标签,它会如你所愿。