2017-01-13 11 views
0

Ruby gem https://github.com/redis/redis-rbを使用しています。ループのためにRubyでRedis pipelineを使用するには?

Redisサーバーへの1回のネットワークトリップでいくつかのRedisコマンドを送信するためにパイプラインを使用したいと思います。ループがある場合はどうしたらいいですか?

たとえば、これは機能しますか?それとも、すべてのコマンドを1つずつ送信するだけですか?

cache = Redis.new() #blah blah 

normalized = cache.pipelined do 
     urls.each do |url| 
      key= "key:#{url}"  
      cache.get(key) 
      key2 = "key2:#{url}" 
      cache.get(key2) 
     end 
    end 

答えて

1

"one network trip"という言葉は誤解です。すべてのパイプラインモードは、前のコマンドの結果を待っている間に他のコマンドを送信します。これは、各要求が完了するまでブロックされるデフォルトとは対照的です。

Rubyライブラリがブロックされている場合、それらは順次発行され、結果を必要とするものはブロックされます。そのモデルの変数に結果を一致させる方が簡単であるため、パイプラインモードの方がはるかに優れている非同期ライブラリがあります。それはさらに多くの仕事です。

通常、検索ではなく複数の割り当てを行う場合は、pipelinedを使用します。そうすれば、INCRの結果が次のものに移る前に完了するのを待つ必要はありません。火をつけて忘れることができます。

クイックリトリーブをお探しの場合はMGETをご利用ください。

+0

ありがとうございます。これは私のためのDOHの瞬間です。どうして、なぜ誰もMGETについて最初から教えてくれなかったのですか?真剣に、これは存在する? –

+0

Redisのドキュメントは楽しいものです。さまざまなコマンドをすべて調べて、そこにあるすっきりしたツールを見てみることを強くお勧めします。あなたが欲しいものを正確に行うきちんとしたことを見つけると、それはしばしば快活に驚くべきことです。 – tadman

関連する問題