2011-10-28 18 views
5

それは述べて:Redisクライアントはどのようにパイプライニングを実装しますか? Redisの<a href="http://redis.io/topics/protocol" rel="noreferrer">protocol documentation</a>で

をクライアントが複数の コマンドを発行するために、同じ接続を使用することができます。パイプライニングがサポートされているので、複数のコマンドをクライアントが1回の書き込み操作で に送信することができます。 を読み込んで次のコマンドを発行する必要はありません。すべての返信 を最後に読むことができます。

しかし、実際にどのように実装されているかの例は見つかりません。 Redisクライアントはどのようにパイプライニングを実装していますか?

答えて

4

TCPストリームのメッセージを簡単に区切ることができれば、サーバーがパイプラインをサポートするためのサポートはほとんど必要ありません。TCPスタックはデータをバッファし、サーバーは要求の読み取り/ 1つずつリクエストを完了すると返信を返信します。クライアント/サーバは、デッドロックではなく、これらのバッファがいっぱいになるケースを認識して処理するだけでよい。

redisはnetworking.cのprocessInputBuffer()/ processMultibulkBuffer()を見ていますが、redisには独自の出力バッファリングもあります。

4

これがどのように実装されているかの良い、簡単な例は、Ruby redisクライアントのソースredis-rbとPythonのredis-pyのいずれかにあります。

彼らはTaylorOtwellは、上記の基本的何

、クライアント側を連結取引がRedisのを使用するのに対し、単一のネットワーク要求にパイプラインでRedisのために行われる要求は、トランザクションを開始し、終了するMULTI/EXECコマンド。

のRedis-RB(redis.rbpipeline.rbから)

def pipelined(options = {}) 
    synchronize do 
    begin 
     original, @client = @client, Pipeline.new 
     yield 
     if @client.commands.empty? 
     [] 
     else 
     original.call_pipelined(@client.commands, options) 
     end 
    ensure 
     @client = original 
    end 
    end 
end 

def call_pipelined(commands, options = {}) 
    @commands.concat commands 
    nil 
end 

もう一つの良い例はredis-pyソース、PythonのRedisのクライアントに見出すことができます。希望が役立ちます。

2

上記の回答にいくつかの洞察を投げかけてください。 redisパイプラインを理解する1つの方法は、redisパイプラインが完全にクライアント側の実装であり、redisサーバーはそれとは関係がないという事実を理解することです。

パイプライン処理は、ネットワーク待機時間が長い環境での応答待ち時間の問題を解決することを目的としています。したがって、コマンドを送信して応答を読み取る際にネットワーク上で費やす時間が短くなればなるほど、より良い結果が得られます。これは、効果的にバッファリングによって達成される。クライアントは、サーバに送信される前に、TCPスタック(他の回答に記載されているように)でコマンドをバッファすることができる(またはしない)ことがあります。サーバーに送信されると、サーバーはそれを実行し、サーバー側でバッファーをバッファーに入れます。応答が受信されるとすぐにクライアントが応答を読み取る通常の場合とは異なり、クライアントはパイプラインの場合、サーバー側バッファからの応答を部分的に読み取るか、アプリケーションが「同期」(パイプラインを閉じる)を実行すると応答を読み取ります。これは、応答を読む際にクライアントがネットワーク上で費やす時間がはるかに短いため、有利です。 http://nachivpn.blogspot.in/2014/11/redis-pipeline-explained.html

:ここ

は、あなたがより良いアイデアを得るために参照することが私のブログの記事です
関連する問題