我有一大堆键和一个值(所有键都相同),应该将其写入 Redis 实例。仅当具有此键的条目已存在时才会发生这种情况。
有 MSETNX命令执行相反的操作:当键不存在时,放入条目。
当然,我可以通过 EXIST 之前检查一下并根据结果设置它,但我如何确保这个atomic.由于这个列表可能非常庞大,我该如何基于管道执行此操作?
我正在使用redis-py作为包装器,并且服务器上没有可用的 Lua 脚本支持。
最佳答案
如果没有 Lua,这不是很方便,但仍然可以使用 WATCH/MULTI/EXEC 命令来完成。这个想法是将巨大的键列表划分为 n 个项目的 block (例如 n=20),然后将以下函数应用于每个 block :
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 命令。不过,您将支付 EXISTS 往返费用。选择正确的 n 值是管道因素和并发交互风险之间的权衡。不宜设置太高。
关于python - redis:设置是否存在 - 通过 python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11828757/