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倍に向上しました。
その他の拡張