Redis パイプライン技術

Redis は、クライアント・サーバーモデルおよびリクエスト/レスポンスプロトコルに基づく TCP サービスです。これは、通常、1 つのリクエストが以下の手順を踏むことを意味します。

  • クライアントはサーバーにクエリ要求を送信し、Socketの返信をリッスンします。通常はブロッキングモードで、サーバーの応答を待ちます。
  • サーバーはコマンドを処理し、結果をクライアントに返します。

Redis パイプライン技術

Redis パイプライン技術では、サーバーが応答していない間も、クライアントはサーバーにリクエストを送信し続けることができ、最終的にすべてのサーバーの応答を一度に読み取ることができます。

例

redis パイプラインを確認するには、redis インスタンスを起動して以下のコマンドを入力するだけです。

$(echo -en "PING\r\n SET サンプルkey redis\r\nGET サンプルkey\r\nINCR visitor\r\nINCR visitor\r\nINCR visitor\r\n"; sleep 10) | nc localhost 6379

+PONG
+OK
redis
:1
:2
:3

上記の例では、私たちは次のコマンドを使用して、PINGredisサービスが利用可能かどうかを確認し、その後 サンプルkey の値を redis に設定し、次に サンプルkey の値を取得して visitor を3回インクリメントしました。

返された結果から、これらのコマンドが一度にredisサービスに送信され、最終的にすべてのサーバーの応答を一度に読み取ったことがわかります。


パイプライン技術の利点

パイプライン技術の最も顕著な利点は、Redis サービスのパフォーマンスを向上させることです。

いくつかのテストデータ

以下のテストでは、パイプライン技術の機能をサポートするRedisのRubyクライアントを使用して、パイプライン技術による速度向上の効果をテストします。

require 'rubygems' 
require 'redis'
def bench(descr) 
start = Time.now 
yield 
puts "#{descr} #{Time.now-start} seconds" 
end
def without_pipelining 
r = Redis.new 
10000.times { 
    r.ping 
} 
end
def with_pipelining 
r = Redis.new 
r.pipelined { 
    10000.times { 
        r.ping 
    } 
} 
end
bench("without pipelining") { 
    without_pipelining 
} 
bench("with pipelining") { 
    with_pipelining 
}

局域网内のMac OS Xシステムで上記の簡単なスクリプトを実行したデータによると、パイプライン操作を有効にすると、往復遅延がかなり低いレベルまで改善されています。

without pipelining 1.185238 seconds 
with pipelining 0.250783 seconds

ご覧のとおり、パイプラインを有効にすると、速度効率は5倍に向上しました。

その他の拡張