一般的に、Redisクライアントがリクエストを発行した後、通常、Redisサーバーが処理するのをブロックして待ちます。 Redisサーバーが処理を完了すると、コマンドを要求した後、結果を応答メッセージを介してクライアントに返します。
これはHBaseのスキャンに少し似ているように感じます。通常、クライアントは各レコードを取得し、一度にサーバーを呼び出します。
Redisでは、Hbaseスキャナーキャッシュに似たものはありますか?
はい、それはPiplineです。公式はじめにhttp://redis.io/topics/pipelining
パイプラインを介して操作の大規模なバッチがある場合、ネットワークの遅延で無駄な時間を節約できます。コマンドはパッケージ化され、パイプラインを使用して送信されることに注意する必要があります。 Redisは、すべてのコマンドを処理する前に、すべてのコマンドの処理結果をキャッシュする必要があります。梱包するコマンドが多いほど、消費するメモリが増えます。したがって、パッケージ化されたコマンドが多いほど良いというわけではありません。
パイプラインを使用する場合、バッチでRedisを読み書きすると、パフォーマンスが大幅に向上しました。
Javaはそれをテストしました:
パッケージcom.lxw1234.redis; import java.util.hashmap; import java.util.map; import java.util.set; import redis.clients.jedis.jedis; import redis.clients.jedis.pipeline; import redis.clients.jedis.ressponse.ressponse.response.ressponse.resspons Jedis Redis = new Jedis( "127.0.0.1"、6379、400000); map <string、string> data = new hashmap <string、string>(); Redis.Select(8); redis.flushdb(); // hmset long start = system.currenttimemillis(); //(int i = 0; i <10000; i ++){data.clear(); data.put( "k_" + i、 "v_" + i); redis.hmset( "key_" + i、data); } long end = system.currenttimemillis(); system.out.println( "dbsize:[" + redis.dbsize() + "] .."); system.out.println( "pipelineなしのhmsetを使用した[" +(end -start) / 1000 + "]秒.."); Redis.Select(8); redis.flushdb(); // Pipeline HMSet Pipeline P = Redis.Pipelined()を使用します。 start = system.currenttimemillis(); for(int i = 0; i <10000; i ++){data.clear(); data.put( "k_" + i、 "v_" + i); p.hmset( "key_" + i、data); } p.sync(); end = system.currenttimemillis(); system.out.println( "dbsize:[" + redis.dbsize() + "] .."); system.out.println( "pipelineを使用したhmset [" +(end -start) / 1000 + "]秒.."); // hmget set <string> keys = redis.keys( "*"); // jedis hgetall start = system.currenttimemillis()を使用します。 map <string、map <string、string >> result = new hashmap <string、map <string、string >>(); for(string key:keys){result.put(key、redis.hgetall(key)); } end = system.currenttimemillis(); system.out.println( "result size:[" + result.size() + "] .."); system.out.println( "pipelineを使用しないhgetall [" +(end -start) / 1000 + "]秒.."); // pipeline hgetall map <string、response <map <string、string >>>> responses = new hashmap <string、response <map <string、string >>>(keys.size()); result.clear(); start = system.currenttimemillis(); for(string key:keys){responses.put(key、p.hgetall(key)); } p.sync(); for(string k:responses.keyset()){result.put(k、responses.get(k).get()); } end = system.currenttimemillis(); system.out.println( "result size:[" + result.size() + "] .."); System.out.println( "pipelineを使用したhgetall [" +(end -start) / 1000 + "]秒.."); redis.disconnect(); }}テスト結果は次のとおりです。
dbsize:[10000] ..パイプラインの使用[243]秒を使用せずにhmset .. dbsize:[10000] .. pipeline with pipeline seed seed [0]秒。
パイプラインを使用してバッチで10,000のレコードを読み書きするのはケーキであり、数秒で行われます。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。