redis集群:从lua脚本中的smembers中删除键

时间:2016-05-03 09:20:09

标签: redis

下面的函数从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)

1 个答案:

答案 0 :(得分:1)

你担心使用那些没有通过eval参数传递的键是正确的。

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

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

(当您进行群集节点重新平衡时,此脚本仍然可能失败,因此您需要弄清楚如何处理它)

也许为该集合中的所有条目添加本地ip作为哈希标记。主键可能成为:

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

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

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