在redis散列(管道内)中对同一个值执行hget和hset的准确性

在redis散列(管道内)中对同一个值执行hget和hset的准确性,redis,Redis,在redis中,我有一个散列,我想首先获取它,然后设置一个值。我想我可以通过减少往返行程来使用管道来加速整个操作,如下所示: my_pipeline = redis.Redis(connection_pool=POOL).pipeline() my_pipeline.hget("my_hash","my_time") my_pipeline.hset("my_hash","my_time",latest_time) result = my_pipeline.execute() old_value

在redis中,我有一个散列,我想首先获取它,然后设置一个值。我想我可以通过减少往返行程来使用管道来加速整个操作,如下所示:

my_pipeline = redis.Redis(connection_pool=POOL).pipeline()
my_pipeline.hget("my_hash","my_time")
my_pipeline.hset("my_hash","my_time",latest_time)
result = my_pipeline.execute()
old_value_of_my_time = result[0]
基本上,我已经尝试检索
my_time
的原始值以供以后使用,然后设置一个新值

所以问题是:是否在同一管道中对相同的值执行
hget
hset
?我从(以及管道的一般知识)中了解到,命令的顺序保留在管道中。所以表面上看,我的方法应该是正确的

然而,我可能遗漏了一些东西,所以专家可以检查这种方法吗


注意:我在示例代码中使用了python语法。此外,如果我没有使用散列,我只会使用
getset
进行此操作。但是请注意,在这种情况下,我必须使用哈希,原因超出了这个问题的范围。

是的,您可以在管道中执行
HGET
HSET
。但是,它的行为与
GETSET
稍有不同
GETSET
是一种原子操作,但管道中
HGET
HSET
的组合是而不是原子操作

Redis保证在运行
HSET
命令之前先运行
HGET
命令。但是,Redis不会以原子方式运行这两个命令。因此,当它运行
HSET
命令时,
HASH
可能已经被另一个客户端修改了。在这种情况下,您不会得到旧值,而是一些旧值


为了实现类似于
GETSET
的功能,您必须在事务中运行
HGET
HSET
,或者将这两个命令包装在
Lua
脚本中。

redis是否本机支持原子事务?当然。你可以通过或来达到这个目的。超出了问题的范围,但我想我已经提出了。你会说python吗?我这样问是因为在python包装器的文档(这里:)中,
pipeline
似乎是默认使用
transaction=True
实现的?我只是想确认一下。