1

キーの膨大なリストと、redis インスタンスに書き込む必要がある 1 つの値 (すべてのキーで同じ) があります。これは、このキーを持つエントリが既に存在する場合にのみ発生します。

反対のことを行うMSETNXコマンドがあります。キーが存在しない場合に、エントリを入力します。

確かに、EXISTを介して事前に確認し、結果に応じて設定することはできますが、このアトミック性をどのように保証しますか。このリストは非常に膨大になる可能性があるため、これをパイプラインベースで行うにはどうすればよいですか?

私はredis-pyをラッパーとして使用していますが、サーバーで利用できる Lua-Scripting サポートはありません。

4

1 に答える 1

3

これは 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 コマンドをパイプライン処理します。ただし、EXISTS の往復料金はお支払いいただきます。n の正しい値を選択することは、パイプライン係数と同時対話のリスクとの間のトレードオフです。高く設定しすぎないでください。

于 2012-08-06T13:55:15.077 に答える