redis:通过python设置是否存在
我有一个巨大的键列表和一个值(所有键都相同),应该写入redis实例。仅当具有此键的条目已存在时,才应发生此情况 有一个相反的命令:当键不存在时,输入条目 当然,我可以在via之前进行检查,并根据结果进行设置,但如何确保此原子。由于这个列表可能非常庞大,我如何基于管道来完成这个任务redis:通过python设置是否存在,python,redis,key-value-store,Python,Redis,Key Value Store,我有一个巨大的键列表和一个值(所有键都相同),应该写入redis实例。仅当具有此键的条目已存在时,才应发生此情况 有一个相反的命令:当键不存在时,输入条目 当然,我可以在via之前进行检查,并根据结果进行设置,但如何确保此原子。由于这个列表可能非常庞大,我如何基于管道来完成这个任务 我正在使用as包装,服务器上没有可用的Lua脚本支持。如果没有Lua,这不是非常方便,但仍然可以使用WATCH/MULTI/EXEC命令来完成。其思想是将庞大的键列表划分为n个项的块(例如,n=20),然后对每个块应
我正在使用as包装,服务器上没有可用的Lua脚本支持。如果没有Lua,这不是非常方便,但仍然可以使用WATCH/MULTI/EXEC命令来完成。其思想是将庞大的键列表划分为n个项的块(例如,n=20),然后对每个块应用以下函数:
def process_block( redis_client, block, value ):
with redis_client.pipeline() as pipe:
while True:
try:
pipe.watch( block )
to_set = [ for x in block if pipe.exists(x) ]
if to_set:
pipe.multi()
for x in to_set:
pipe.set( x, value )
pipe.execute()
break
except redis.WatchError:
continue
finally:
pipe.reset()
原子性由WATCH/MULTI/EXEC命令保证,您将通过管道传输1个WATCH、1个MULTI、最多n个SET和1个EXEC命令。不过,您将支付现有的往返费用。为n选择正确的值是管道因素和并发交互风险之间的权衡。不应设置得太高。用于创建锁。这将使您的所有操作原子化。这不是我所期望的,但只要我不想更新,我会尝试一下。谢谢!