Redis学習ノート7-Redisパイプ(pipeline)
3891 ワード
詳細
redisのパイプライン(Pipelining)操作は非同期のアクセスモードであり、一度に複数の命令を送信し、その戻り結果を同期せずに待つ.これにより、非常に良好な実行効率が得られる.これがパイプです.呼び出し方法は次のとおりです.
redisはcsモードのtcp serverであり、httpと同様のリクエスト応答プロトコルを使用する.1つのクライアントは、1つのsocket接続を介して複数のリクエストコマンドを開始することができる.各リクエストコマンドが発行されるとclientは通常ブロックされ、redisサービス処理を待機し、redis処理が完了するとリクエストコマンドが発行された後、結果は応答メッセージを介してclientに返されます.基本的な通信プロセスは次のとおりです.
参照
Client: INCR X
Server: 1
Client: INCR X
Server: 2
Client: INCR X
Server: 3
Client: INCR X
Server: 4
基本的に4つのコマンドは、完了するには8つのtcpメッセージが必要です.通信にネットワーク遅延があるため、clientとserver間のパケット転送時間が0.125秒かかる場合.では、上の4つのコマンド8つのメッセージは少なくとも1秒で完了します.これにより、redisは毎秒100個のコマンドを処理することができても、私たちのclientは1秒で4つのコマンドしか発行できません.これはredisの処理能力を十分に利用していないことを示している.mget,msetのような単一のコマンドで複数のkeyのコマンドを処理できるほか,pipeline方式でclientパッケージから複数のコマンドを一括して発行することができ,単一のコマンドの応答が戻るのを待つ必要はなく,redisサービス側は複数のコマンドを処理した後,複数のコマンドの処理結果を一括してクライアントに返す.通信プロセスは次のとおりです.
参照
Client: INCR X
Client: INCR X
Client: INCR X
Client: INCR X
Server: 1
Server: 2
Server: 3
Server: 4
tcpメッセージが長すぎるために分割されないと仮定します.2つのtcpメッセージで4つのコマンドが完了する可能性があります.clientは4つのincrコマンドを1つのtcpメッセージに一緒に送信することができ、serverは4つのコマンドの処理結果を1つのtcpメッセージに戻すことができます.pipeline方式で大量の操作がある場合.ネットワークの遅延時間を無駄にすることができます.コマンド送信はpipeline方式でパッケージ化されており、redisはすべてのコマンドを処理する前にすべてのコマンドの処理結果をキャッシュしなければならないことに注意してください.パッケージ化されたコマンドが多ければ多いほど、キャッシュのメモリ消費量も多くなります.だからパッケージのコマンドが多ければ多いほどいいのではないでしょうか.具体的にどのくらい適切かは具体的な状況に応じてテストする必要があります.次はjedisクライアントがpipelineを使用するテストです.
redisのパイプライン(Pipelining)操作は非同期のアクセスモードであり、一度に複数の命令を送信し、その戻り結果を同期せずに待つ.これにより、非常に良好な実行効率が得られる.これがパイプです.呼び出し方法は次のとおりです.
@Test
public void test3Pipelined() {
Jedis jedis = new Jedis("localhost");
Pipeline pipeline = jedis.pipelined();
long start = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
pipeline.set("p" + i, "p" + i);
}
List
redisはcsモードのtcp serverであり、httpと同様のリクエスト応答プロトコルを使用する.1つのクライアントは、1つのsocket接続を介して複数のリクエストコマンドを開始することができる.各リクエストコマンドが発行されるとclientは通常ブロックされ、redisサービス処理を待機し、redis処理が完了するとリクエストコマンドが発行された後、結果は応答メッセージを介してclientに返されます.基本的な通信プロセスは次のとおりです.
参照
Client: INCR X
Server: 1
Client: INCR X
Server: 2
Client: INCR X
Server: 3
Client: INCR X
Server: 4
基本的に4つのコマンドは、完了するには8つのtcpメッセージが必要です.通信にネットワーク遅延があるため、clientとserver間のパケット転送時間が0.125秒かかる場合.では、上の4つのコマンド8つのメッセージは少なくとも1秒で完了します.これにより、redisは毎秒100個のコマンドを処理することができても、私たちのclientは1秒で4つのコマンドしか発行できません.これはredisの処理能力を十分に利用していないことを示している.mget,msetのような単一のコマンドで複数のkeyのコマンドを処理できるほか,pipeline方式でclientパッケージから複数のコマンドを一括して発行することができ,単一のコマンドの応答が戻るのを待つ必要はなく,redisサービス側は複数のコマンドを処理した後,複数のコマンドの処理結果を一括してクライアントに返す.通信プロセスは次のとおりです.
参照
Client: INCR X
Client: INCR X
Client: INCR X
Client: INCR X
Server: 1
Server: 2
Server: 3
Server: 4
tcpメッセージが長すぎるために分割されないと仮定します.2つのtcpメッセージで4つのコマンドが完了する可能性があります.clientは4つのincrコマンドを1つのtcpメッセージに一緒に送信することができ、serverは4つのコマンドの処理結果を1つのtcpメッセージに戻すことができます.pipeline方式で大量の操作がある場合.ネットワークの遅延時間を無駄にすることができます.コマンド送信はpipeline方式でパッケージ化されており、redisはすべてのコマンドを処理する前にすべてのコマンドの処理結果をキャッシュしなければならないことに注意してください.パッケージ化されたコマンドが多ければ多いほど、キャッシュのメモリ消費量も多くなります.だからパッケージのコマンドが多ければ多いほどいいのではないでしょうか.具体的にどのくらい適切かは具体的な状況に応じてテストする必要があります.次はjedisクライアントがpipelineを使用するテストです.
package com.jd.redis.client;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Pipeline;
publicclass PipelineTest {
/**
* @param args
*/
publicstaticvoid main(String[] args) {
int count = 1000;
long start = System.currentTimeMillis();
withoutPipeline(count);
long end = System.currentTimeMillis();
System.out.println("withoutPipeline: " + (end-start));
start = System.currentTimeMillis();
usePipeline(count);
end = System.currentTimeMillis();
System.out.println("usePipeline: " + (end-start));
}
privatestaticvoid withoutPipeline(int count){
Jedis jr = null;
try {
jr = new Jedis("10.10.224.44", 6379);
for(int i =0; i
:
withoutPipeline: 11341
usePipeline: 344
, pipeline 。 Win7 Jedis Java Linux Redis Server。
:http://blog.csdn.net/freebird_lb/article/details/7778919