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 作为键,它将全部映射到正确的节点。
你的密钥是动态的,你使用散列标签,它会如你所愿。
我已经搜索过这个问题的答案,但每个问题都没有真正抓住我的问题。
我正在使用 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 作为键,它将全部映射到正确的节点。
你的密钥是动态的,你使用散列标签,它会如你所愿。