Redis 의 파이프 (Pipeline) 를 사용 하여 대량 작업 을 진행 합 니 다.

7664 단어 Redis
Redis 파이프 기술 안내
Reids 는 http 요청 과 유사 한 cs 모드 의 Tcp 서비스 입 니 다.클 라 이언 트 가 요청 을 보 낼 때 서버 가 처리 한 후에 결 과 를 응답 메 시 지 를 통 해 클 라 이언 트 에 게 되 돌려 줍 니 다.
그럼 여러 요청 을 보 내야 할 때 매번 요청 응답 을 기다 리 고 다음 요청 을 보 내야 합 니까?
물론 아 닙 니 다. 여기 서 레 디 스 의 파이프 기술 을 사용 할 수 있 습 니 다.
예 를 들 어 제 디 스 가: request response, request response,...;
          그렇다면 pipeline 은: request request... response response 방식 입 니 다.
파 이 프 를 사용 하 는 효 과 를 간단하게 테스트 해 보 자.
단일 삽입 및 일괄 삽입
레 디 스에 데 이 터 를 하나씩, 대량으로 기록 합 니 다.먼저 Mysql 에서 필요 한 데 이 터 를 찾 아 보 세 요. 여 기 는 약 300 개 정도 입 니 다. 데이터 의 양 이 많 지 않 지만 테스트 를 간단하게 하 는 것 은 문제 가 없 을 것 입 니 다.단일 삽입 -- Jedis:
    Jedis jedis = jedisPool.getResource();
    long start = System.currentTimeMillis();
    List vehicleInfos  = vehicleInfoMapper.selectByParam(param);
    for (VehicleInfo vehicleInfo : vehicleInfos) {      
        //    vehicleInfo
        TVehicleRealReportMsg real = new TVehicleRealReportMsg();
        Map keysmap = new HashMap();
        keysmap.put("vehicleStatus", real.getVehicleStatus() + "");
        keysmap.put("chargeStatus", real.getChargeStatus() + "");
        keysmap.put("longitude", "9");
        keysmap.put("latitude", "9");
        List list1 = new ArrayList();
        Long l = 1000L;
        Long l2 = 22222L;
        list1.add(l);
        list1.add(l2);
        real.setEngineFaultsList(list1);
        keysmap.put("engineFaultsList", JSON.toJSONString(list1));
        //    
        jedis.hmset(vehicleInfo.getVehicleSeq()+"", keysmap);
    }   
    jedis.close();          
    long end = System.currentTimeMillis(); System.out.println("  :"+(end-start) +"ms");  

결과: 467 ms
일괄 삽입 - 파이프라인:
    Jedis jedis = jedisPool.getResource();
    Pipeline pip = jedis.pipelined();
    long start = System.currentTimeMillis();
    List vehicleInfos  = vehicleInfoMapper.selectByParam(param);
    for (VehicleInfo vehicleInfo : vehicleInfos) {      
        //    vehicleInfo
        TVehicleRealReportMsg real = new TVehicleRealReportMsg();
        Map keysmap = new HashMap();
        keysmap.put("vehicleStatus", real.getVehicleStatus() + "");
        keysmap.put("chargeStatus", real.getChargeStatus() + "");
        keysmap.put("longitude", "9");
        keysmap.put("latitude", "9");
        List list1 = new ArrayList();
        Long l = 1000L;
        Long l2 = 22222L;
        list1.add(l);
        list1.add(l2);
        real.setEngineFaultsList(list1);
        keysmap.put("engineFaultsList", JSON.toJSONString(list1));
        //    
        pip.hmset(vehicleInfo.getVehicleSeq()+"", keysmap);
    }
    pip.sync();//  
    jedis.close();      
    long end = System.currentTimeMillis();
    System.out.println("  :"+(end-start) +"ms");  

결과: 175 ms
파 이 프 를 사용 한 후의 시간 은 단일 삽입 의 총 시간 보다 크게 줄 어 들 고 성능 이 우수 하 다 는 것 을 알 수 있다.
단일 읽 기와 일괄 읽 기
단일 읽 기 - Jedis:
    Jedis jedis = jedisPool.getResource();
    long start = System.currentTimeMillis();
    //1.  redis    
    List vehicleInfos = vehicleInfoMapper.selectByParam(param);
    List list = new ArrayList();
    for(VehicleInfo key: vehicleInfos){
        String hashkey = key.getVehicleSeq()+"";
        if(jedis.exists(hashkey+"")){                           
        Coordinate coord = new Coordinate();
        coord.setVehicleSeq(key.getVehicleSeq());
        coord.setOrgId(key.getOrgId()); 
        coord.setVehiclemodelseq(key.getVehiclemodelseq()); 
        coord.setVin(jedis.hget(hashkey, "vin"));
        coord.setLongitude(Long.valueOf(jedis.hget(hashkey, "longitude")));
        coord.setLatitude(Long.valueOf(jedis.hget(hashkey, "latitude")));       
        list.add(coord);
        }
    }   
    jedis.close();
    long end = System.currentTimeMillis();
    System.out.println("  :"+(end-start)+" ms");
    return list;  

결과: 첫 번 째 1032 ms 이후 800 ~ 900 ms 안정
일괄 읽 기 - 파이프라인:
    Jedis jedis = jedisPool.getResource();
    Pipeline pip = jedis.pipelined();
    long start = System.currentTimeMillis();
    //2.  redis    
    List vehicleInfos = vehicleInfoMapper.selectByParam(param);
    List list = new ArrayList();
    Map map = new HashMap();//map      
    Map>> responses  = new HashMap>>(vehicleInfos.size());
    for(VehicleInfo info: vehicleInfos){
        List> resls = new ArrayList>();
        resls.add(pip.hget(info.getVehicleSeq()+"","longitude"));
        resls.add(pip.hget(info.getVehicleSeq()+"","latitude"));
        responses.put(info.getVehicleSeq() + "", resls);//             --300  
        map.put(info.getVehicleSeq()+"orgId", info.getOrgId());
        map.put(info.getVehicleSeq()+"vin", info.getVin());
        map.put(info.getVehicleSeq()+"vehiclemodelseq", info.getVehiclemodelseq());
    }
    pip.sync(); 
    for(String k:responses.keySet()){
        Coordinate coord = new Coordinate();
        coord.setLongitude(Long.valueOf(responses.get(k).get(0).get()));// get,  toString
        coord.setLatitude(Long.valueOf(responses.get(k).get(1).get()));
        coord.setVehicleSeq(Long.valueOf(k));
        coord.setOrgId((String) map.get(k+"orgId"));
        coord.setVin((String) map.get(k+"vin"));
        coord.setVehiclemodelseq((Long) map.get(k+"vehiclemodelseq"));
        list.add(coord);
    }
    jedis.close();
    long end = System.currentTimeMillis();
    System.out.println("  :"+(end-start)+" ms");
    return list;  

결과: 첫 번 째 200 ms 이후 30ms 정도 유지
총 시간 은 한 줄 로 읽 는 총 시간의 1 / 5, 심지어 더 낮 아서 파이프 가 효율 을 크게 향상 시 키 고 더 좋 은 성능 을 가 진 다 는 것 을 알 수 있다.
주: 파 이 프 를 사용 하여 가 져 온 값 의 종 류 는 Response 이 므 로 String 으로 전환 해 야 합 니 다. 다음 코드 세 션:
Map<String,List<Response<String>>> responses  = new HashMap<String, List<Response<String>>>  (vehicleInfos.size());  
    // String
 responses.get(k).get(0).get();  

총결산
  • 여기 서 300 개의 데이터 조작 만 테스트 하여 상대 적 으로 뚜렷 한 효 과 를 거 두 었 다.
  • 대량의 데이터 조작 에 대해 Redis 파 이 프 를 사용 하면 성능 과 효율 을 크게 향상 시 킬 수 있다.
  • 좋은 웹페이지 즐겨찾기