Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
redis:通过python设置是否存在_Python_Redis_Key Value Store - Fatal编程技术网

redis:通过python设置是否存在

redis:通过python设置是否存在,python,redis,key-value-store,Python,Redis,Key Value Store,我有一个巨大的键列表和一个值(所有键都相同),应该写入redis实例。仅当具有此键的条目已存在时,才应发生此情况 有一个相反的命令:当键不存在时,输入条目 当然,我可以在via之前进行检查,并根据结果进行设置,但如何确保此原子。由于这个列表可能非常庞大,我如何基于管道来完成这个任务 我正在使用as包装,服务器上没有可用的Lua脚本支持。如果没有Lua,这不是非常方便,但仍然可以使用WATCH/MULTI/EXEC命令来完成。其思想是将庞大的键列表划分为n个项的块(例如,n=20),然后对每个块应

我有一个巨大的键列表和一个值(所有键都相同),应该写入redis实例。仅当具有此键的条目已存在时,才应发生此情况

有一个相反的命令:当键不存在时,输入条目

当然,我可以在via之前进行检查,并根据结果进行设置,但如何确保此原子。由于这个列表可能非常庞大,我如何基于管道来完成这个任务


我正在使用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选择正确的值是管道因素和并发交互风险之间的权衡。不应设置得太高。

用于创建锁。这将使您的所有操作原子化。这不是我所期望的,但只要我不想更新,我会尝试一下。谢谢!