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()
这在没有Lua的情况下不太方便,但是仍然可以使用WATCH/MULTI/EXEC命令来完成。这样做的目的是将庞大的键列表分成n个项的块(例如n=20),然后将以下函数应用于每个块:
Atomicity是由WATCH/MULTI/EXEC命令保证的,您将通过管道传输1个WATCH、1个MULTI、最多n个SET和1个EXEC命令。不过,您将为EXISTS往返支付费用。为n选择正确的值是流水线因素和并发交互风险之间的权衡。它不应该设得太高。在
相关问题 更多 >
编程相关推荐