1

如何原子地执行这些操作?

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
4

3 回答 3

6

您可以制作一个 lua 脚本并使用EVAL命令执行它。它将有效地使整个过程原子化。

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

于 2012-07-05T07:05:38.667 回答
0

您可能希望使用手表在事务中执行此操作https://github.com/andymccurdy/redis-py/#pipelines

于 2012-08-10T13:40:39.983 回答
-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
于 2016-10-28T06:57:21.707 回答