在Redis中执行字典的并发更新

2024-10-02 14:28:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用Redis作为不同应用程序发行版之间的集中内存数据存储

当我的应用程序的所有发行版都在同一个键上运行时,我担心会出现并发的情况。举个例子:

THIS_DISTRIBUTION_NAME = "Alpha1"

alive_distributions = redis.hmget('alive_distributions') # {"Charlie1": 1623234874}

alive_distributions[THIS_DISTRIBUTION_NAME] = int(time.time()) # {"Charlie1": 1623234874,"Alpha1": 1623234875}

redis.hmset('alive_machines', alive_distributions) 

如果在Alpha1hmgethmset操作之间更新Charlie1,则会导致数据不一致

如何在没有并发的情况下执行安全的、类似事务的字典更新


Tags: 数据nameredis应用程序time情况thisdistribution
2条回答

Redis支持transactions,我将专门研究文档的check-and-set部分。乐观地说,这正是你所需要的

更新#1


假设redis-py作为您的redis客户端,您可以执行以下操作:

pipe = redis.pipeline()
pipe.watch('some_key') # watch key 'some_key'
value = pipe.get('some_key')
pipe.multi() # start transaction
value = 'some_value'
pipe.set('some_key', value) # update 'some_key' with new value
pipe.execute() # will fail if some other process wrote to 'some_key' in the meantime

您感兴趣的操作可以包装在MULTI/EXEC事务中,以确保两个字段都已更新或没有更新。 您需要的命令itslef是zadd命令。事实上,使用zadd comand,您可以在一段时间后自动对预设值进行索引(更新)

相关问题 更多 >