Java는 Pipeline을 사용하여 Redis 일괄 읽기(hmset & hgetall)

4113 단어 javaredishgetall
일반적으로 Redis Client 측에서 요청을 보내면 Redis 서비스 측의 처리를 막고 기다립니다. Redis 서비스 측이 처리한 후에 명령을 요청하면 응답 메시지를 통해 결과를 클라이언트에게 되돌려줍니다.
이것은 HBase의 Scan과 약간 비슷하다고 느낀다. 보통 클라이언트 측에서 모든 기록을 가져오는 것은 RPC 호출 서버이다.
Redis에서 HBase Scanner Caching과 같은 것이 있습니까? 한 번의 요청으로 여러 개의 기록을 되돌려 주시겠습니까?
네, 이것이 바로 Pipline입니다.공식 소개http://redis.io/topics/pipelining
pipeline 방식을 통해 대량의 조작이 있을 때 우리는 원래 네트워크에서 지연되는 시간을 많이 절약할 수 있다. pipeline 방식으로 명령을 포장하여 발송하는 것을 주의해야 한다.redis는 모든 명령을 처리하기 전에 모든 명령의 처리 결과를 캐시해야 한다.패키지 명령이 많을수록 캐시에 메모리가 많이 소모됩니다.그래서 짐을 싸라는 명령이 많을수록 좋은 것은 아니다.
Pipeline을 사용하면 Redis를 대량으로 읽고 쓸 때 성능이 크게 향상됩니다.
Java 테스트:

package 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.Response;


public class Test {
 
 public static void main(String[] args) throws Exception {
 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();
 // hmset
 for (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 without pipeline used [" + (end - start) / 1000 + "] seconds ..");
 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("hmset with pipeline used [" + (end - start) / 1000 + "] seconds ..");
 
 //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("hgetAll without pipeline used [" + (end - start) / 1000 + "] seconds ..");
 
 // 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("hgetAll with pipeline used [" + (end - start) / 1000 + "] seconds ..");
 
 redis.disconnect();
 
 }
 
 
}

테스트 결과는 다음과 같습니다.

dbsize:[10000] .. 
hmset without pipeline used [243] seconds .. 
dbsize:[10000] .. 
hmset with pipeline used [0] seconds .. 
result size:[10000] .. 
hgetAll without pipeline used [243] seconds .. 
result size:[10000] .. 
hgetAll with pipeline used [0] seconds .. 
pipeline을 사용하여 10000개의 기록을 대량으로 읽는 것은 식은 죽 먹기, 초끝이다.
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.

좋은 웹페이지 즐겨찾기