일반적으로, 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.respons; 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 ( "파이프 라인이없는 hmset [" + (END -Start) / 1000 + "] 초."); redis.select (8); redis.flushdb (); // 파이프 라인 사용 hmset 파이프 라인 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 ( "파이프 라인이있는 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 (문자열 키 : 키) {result.put (key, redis.hgetall (key)); } end = System.CurrentTimeMillis (); System.out.println ( "결과 크기 : [" + result.size () + "];"); System.out.println ( "파이프 라인이없는 hgetall [" + (End -Start) / 1000 + "] 초."); // 파이프 라인 사용 hgetall map <string, 응답 <map <string, String >>>> 응답 = new Hashmap <String, 응답 <map <String, String >>> (keys.size ()); result.clear (); start = system.currenttimeMillis (); for (문자열 키 : 키) {responses.put (key, p.hgetall (key)); } p.sync (); for (string k : responses.keyset ()) {result.put (k, response.get (k) .get ()); } end = System.CurrentTimeMillis (); System.out.println ( "결과 크기 : [" + result.size () + "];"); System.out.println ( "파이프 라인이있는 hgetall [" + (END -Start) / 1000 + "] 초."); redis.disconnect (); }} 테스트 결과는 다음과 같습니다.
dbsize : [10000] .. 파이프 라인이없는 hmset [243] 초. [243] 초 : [10000] .. 파이프 라인이 사용 된 HMSET [0] 초 [0] 초.
파이프 라인을 사용하여 배치로 10,000 개의 레코드를 읽고 쓰는 것은 케이크 조각이며 몇 초 만에 수행됩니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.