gpt4 book ai didi

python - Redis,只允许对现有键进行操作

转载 作者:IT王子 更新时间:2023-10-29 06:01:24 27 4
gpt4 key购买 nike

我正在使用python包(redis-py)来操作redis数据库。我有一堆客户端在 redis 中设置散列的键和值。我希望他们仅在散列存在时才设置键和值。如果散列不存在,设置键和值将创建散列,这不是我想要做的。

在redis-py页面(https://github.com/andymccurdy/redis-py)中,作者提出了一种在客户端进行原子操作的方法。所以我写了一个类似的函数:

    with r.pipeline() as pipe:
while True:
try:
pipe.watch("a_hash")
if pipe.exists("a_hash"):
pipe.hset("a_hash", "key", "value")
break
except redis.WatchError:
continue
finally:
pipe.reset()

但是,这似乎行不通。在我从另一个客户端删除散列后,这个散列仍然是由这段代码创建的,所以我猜这段代码不是原子操作。有人可以帮我确定这段代码有什么问题吗?或者有更好的方法来达到这个目的吗?

感谢您的帮助!

最佳答案

我建议阅读 Redis documentation 中解释的 WATCH/MULTI/EXEC block 的定义。 .

在这样的 block 中,只有 MULTI 和 EXEC 之间的命令实际上是原子处理的(并且有条件地,根据 watch 使用全有或全无语义)。

在您的示例中,EXISTS 和 HSET 命令不是自动执行的。实际上,您不需要这种原子性:您需要的是条件执行。

这应该会更好:

with r.pipeline() as pipe:
while True:
try:
pipe.watch("a_hash")
if pipe.exists("a_hash"):
pipe.multi()
pipe.hset("a_hash", "key", "value")
pipe.execute()
break
except redis.WatchError:
continue
finally:
pipe.reset()

如果在 EXISTS 之后但在 MULTI 之前删除 key ,则不会执行 HSET,感谢 watch 。

使用 Redis 2.6,一个 Lua server-side script可能更容易编写,也更高效。

关于python - Redis,只允许对现有键进行操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10987441/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com