Redis 의 파이프 (Pipeline) 를 사용 하여 대량 작업 을 진행 합 니 다.
7664 단어 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();
총결산
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
그래프 구조를 무상으로 취급할 수 없는 것은 싫기 때문에, redisgraph를 WSL2에 극치고 설치해 보았습니다.제목은 만우절이므로. 그렇다, 역시, 앞으로는 그래프 구조 데이터베이스라고 생각했다. 생각한 것은 몇 년 전인가. 전부터 Neo4j는 시험하고 있지만, 영업 분들로부터 상용 라이센스가 높다고 가르쳐 주었으므로, 전전...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.