下面的函数从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)
答案 0 :(得分:1)
你担心使用那些没有通过eval参数传递的键是正确的。
Redis Cluster不保证在运行lua脚本的节点中存在这些密钥,因此其中一些删除命令将失败。
您可以做的一件事是使用通用标签标记所有这些键。这将保证任何时间节点重新平衡不在进行中,具有相同散列标记的密钥将出现在同一节点上。请参阅redis集群规范中有关哈希标记的部分。 http://redis.io/topics/cluster-spec
(当您进行群集节点重新平衡时,此脚本仍然可能失败,因此您需要弄清楚如何处理它)
也许为该集合中的所有条目添加本地ip作为哈希标记。主键可能成为:
key = 'Server:{' + str(localIP) + '}:UserLock'
在字符串中的ip周围添加{}将redis读取为主题标签。
您还需要添加相同的主题标签{“(localIP)”}作为此操作的一部分,您将稍后删除的所有条目的键的一部分。