在redis散列(管道内)中对同一个值执行hget和hset的准确性
在redis中,我有一个散列,我想首先获取它,然后设置一个值。我想我可以通过减少往返行程来使用管道来加速整个操作,如下所示:在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
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
实现的?我只是想确认一下。