如何以原子方式执行这些操作?
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
答案 0 :(得分:6)
您可以创建一个lua脚本并使用EVAL命令执行它。它将有效地使整个过程成为原子。
请注意,带有Lua脚本的Redis尚未发布(2.6-rc5),但它已经非常稳定了。
答案 1 :(得分:0)
答案 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