gpt4 book ai didi

redis 集群 : delete keys from smembers in lua script

转载 作者:可可西里 更新时间:2023-11-01 11:20:30 25 4
gpt4 key购买 nike

下面的函数从 smembers 中删除键,它们不是通过 eval 参数传递的,在 redis 集群中是否合适?

def ClearLock():
key = 'Server:' + str(localIP) + ':UserLock'
script = '''
local keys = redis.call('smembers', KEYS[1])
local count = 0
for k,v in pairs(keys) do
redis.call('delete', v)
count = count + 1
end
redis.call('delete', KEYS[1])
return count
'''
ret = redisObj.eval(script, 1, key)

最佳答案

您担心使用那些未通过 eval 参数传递的键是正确的。

Redis 集群不保证这些键存在于运行 lua 脚本的节点中,因此其中一些删除命令将失败。

您可以做的一件事是用一个共同的标签标记所有这些键。这将为您保证任何时间节点重新平衡不在进行中,具有相同哈希标签的 key 将出现在同一节点上。请参阅 redis 集群规范中有关散列标签的部分。 http://redis.io/topics/cluster-spec

(当你在做集群节点重新平衡时,这个脚本仍然会失败,所以你需要弄清楚你想如何处理它)

或许将该集合中所有条目的本地 ip 添加为散列标签。主键可以变成:

 key = 'Server:{' + str(localIP) + '}:UserLock'

在字符串中的 ip 周围添加 {} 将使 redis 将其读取为主题标签。

您还需要添加相同的标签 {"(localIP)"} 作为所有条目的键的一部分,您稍后将作为此操作的一部分删除。

关于redis 集群 : delete keys from smembers in lua script,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37000252/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com