Redis中的原子操作

时间:2012-07-05 07:04:08

标签: python redis

如何以原子方式执行这些操作?

def setNickName(nick):
    oldNick = r.get("user:id:1:nick") # r - instance of redis.Redis()
    updated = r.set("user:id:1:nick", nick) if r.hsetnx("user:ref:nick", nick, '1') else False

    if updated and oldNick:
        r.hdel("user:ref:nick", oldNick)
        return True

    return False

3 个答案:

答案 0 :(得分:6)

您可以创建一个lua脚本并使用EVAL命令执行它。它将有效地使整个过程成为原子。

请注意,带有Lua脚本的Redis尚未发布(2.6-rc5),但它已经非常稳定了。

答案 1 :(得分:0)

您希望在使用监视https://github.com/andymccurdy/redis-py/#pipelines

的交易中执行此操作

答案 2 :(得分:-1)

让我用管道重写你的代码:

def setNickName(nick):
    with r.pipeline() as pipe:
        while 1:
            try:
                pipe.watch("user:id:1:nick")
                oldNick = pipe.get("user:id:1:nick") # r - instance of redis.Redis()
                pipe.multi()
                updated = r.set("user:id:1:nick", nick) if r.hsetnx("user:ref:nick", nick, '1') else False
                pipe.execute()
                if updated and oldNick:
                    r.hdel("user:ref:nick", oldNick)
                    return True
                print("False")
            except redis.WatchError:
                 continue