Redis哈希中同字段HGET与HSET的流水线操作有效性验证
这种流水线操作完全可行!
你的思路非常正确——用Redis流水线打包HGET和HSET命令,既能减少网络往返次数提升效率,也能准确拿到my_time字段的原始值。
为什么可行?
Redis的流水线(Pipeline)本质是把多个命令一次性发送给服务器,服务器会按你添加的顺序依次执行这些命令。在你的代码里:
- 先执行
HGET "my_hash" "my_time",获取字段的原始值; - 紧接着执行
HSET "my_hash" "my_time" latest_time,设置新值。
因为Redis是单线程处理命令的,这两个命令之间不会插入其他客户端的操作,所以你拿到的result[0]肯定是HSET执行前的原始值,完全符合你的需求。
代码细节解释
看一下你的代码:
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]
result是一个数组,第一个元素result[0]是HGET的返回值(也就是my_time的原始值);- 第二个元素
result[1]是HSET的返回值:1表示该字段之前不存在,这次是新增;0表示字段已存在,这次是更新。
额外注意事项
如果你的场景需要严格保证这两个命令要么都执行,要么都不执行(比如HGET执行失败时,HSET也不执行),可以显式开启事务(不过Python的redis-py库默认流水线是带事务的,也就是自动添加MULTI和EXEC):
with redis.Redis(connection_pool=POOL).pipeline(transaction=True) as pipe: pipe.hget("my_hash", "my_time") pipe.hset("my_hash", "my_time", latest_time) result = pipe.execute() old_value_of_my_time = result[0]
总之,你的实现方式完全没问题,可以放心使用!
内容的提问来源于stack exchange,提问作者Hassan Baig
相关产品推荐
相关产品推荐

