redis:通过python设置是否存在

2024-10-02 12:23:58 发布

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

我有一个庞大的键列表和一个值(所有键都一样),应该写入redis实例。只有当具有此键的条目已经存在时,才应该发生这种情况。在

有一个MSETNX命令,它的作用是相反的:当键不存在时,放入条目。在

当然,我可以在via EXIST之前检查并根据结果设置它,但是我如何确保这个原子。由于这个列表可能非常庞大,我该如何基于管道来实现这一点?在

我使用redis-py作为包装器,服务器上没有Lua脚本支持。在


Tags: 实例py命令服务器redis列表管道情况
1条回答
网友
1楼 · 发布于 2024-10-02 12:23:58

这在没有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()

Atomicity是由WATCH/MULTI/EXEC命令保证的,您将通过管道传输1个WATCH、1个MULTI、最多n个SET和1个EXEC命令。不过,您将为EXISTS往返支付费用。为n选择正确的值是流水线因素和并发交互风险之间的权衡。它不应该设得太高。在

相关问题 更多 >

    热门问题