728x90
반응형
안녕하세요 간이로 프로젝트를 진행하던 중 자주 쓰는 데이터를 레디스에서 캐시로 사용하는
부분이 있어 한가지 실험을 해보려고 합니다.
레디스에 캐시된 데이터 조회 vs 데이터베이스에서 데이터 조회
1. 첫번째 실험 레디스에서 캐시된 데이터 조회
long startTime = System.currentTimeMillis(); // 전체 시작 시간
MemberDto memberCashDto = (MemberDto) cashRepository.get("memberDto::" + username);
if (memberCashDto != null) {
// 조회 성공
long redisEndTime = System.currentTimeMillis(); // Redis 조회 완료 시간
// 토큰, 사용자 이름 및 이메일 리턴
Map<String, Object> resultMap = new HashMap<>();
resultMap.put("token", token);
resultMap.put("refreshToken", refreshToken); //리프레시 토큰 추가
resultMap.put("username", username);
resultMap.put("userId", userId);
resultMap.put("img", memberCashDto.getImgPath());
long endTime = System.currentTimeMillis(); // 전체 완료 시간
log.info("Redis 조회 시간: {}" , redisEndTime - startTime + "ms");
log.info("전체 실행 시간: {}" , endTime - startTime + "ms");
return resultMap;
}
레디스에는 이렇게 캐시를 해줬습니다. 첫번째 실험은 해당 레디스에 키를 확인하고 레디스에서 데이터를 조회하여
전달하는 구조입니다.
결과는 이렇게 나왔습니다.
2. 데이터 베이스에서 조회
MemberDto memberCashDto = (MemberDto) cashRepository.get("memberDto::" + username);
long startTime = System.currentTimeMillis(); // 전체 시작 시간
if (memberCashDto != null) {
// 토큰, 사용자 이름 및 이메일 리턴
Map<String, Object> resultMap = new HashMap<>();
resultMap.put("token", token);
resultMap.put("refreshToken", refreshToken); //리프레시 토큰 추가
resultMap.put("username", username);
resultMap.put("userId", userId);
resultMap.put("img", memberCashDto.getImgPath());
return resultMap;
} else{
Optional<Member> memberOpt = userRepository.findByUserEmail(userId);
if(!memberOpt.isPresent()){
throw new RuntimeException("회원을 찾을 수 없습니다.");
}
Member member = memberOpt.get();
// 레디스 저장
// MemberDto dto = new MemberDto();
// dto.setUserEmail(member.getUserEmail());
// dto.setUserNo(member.getUserNo());
// dto.setPassword(member.getPassword());
// dto.setUserPhn(member.getUserPhn());
// dto.setImgPath(member.getImgPath());
// dto.setUserName(member.getUserName());
// dto.setUserRole(member.getUserRole());
// cashRepository.save("memberDto::" + username, dto,3, TimeUnit.DAYS);
// 토큰, 사용자 이름 및 이메일 리턴
Map<String, Object> resultMap = new HashMap<>();
resultMap.put("token", token);
resultMap.put("refreshToken", refreshToken); //리프레시 토큰 추가
resultMap.put("username", username);
resultMap.put("userId", userId);
resultMap.put("img", member.getImgPath());
long endTime = System.currentTimeMillis(); // 전체 완료 시간
// log.info("Redis 조회 시간: {}" , redisEndTime - startTime + "ms");
log.info("전체 실행 시간: {}" , endTime - startTime + "ms");
return resultMap;
}
주석처리를 하고 데이터베이스에서 조회하는 방법으로 변경하였습니다.
같은 값이 나옵니다. 판별이 불가하여 실험 방법을 변경하였습니다.
3. 나노초로 판단
-> 나노초 실험을 해보기로 결정
위의 코드에서 System.currentTimeMillis(); -> System.nanoTime(); 으로 변경
DB 조회 시 결과 :
레디스 조회 시 결과:
결론: 약 3배 차이로 레디스가 빠름
번외:
실험 결과를 확인하고 곰곰히 생각해 봤는데
db는 다른 서버를 사용하였고 레디스는 로컬호스트를 이용했다는 사실을 뒤늦게 깨달음
실험환경이 동일하지 않다는 것을 깨달아 동일 환경 세팅 후 재 실험 -> 결과 레디스가 어쨋든 2배 빠르다는 것을 확인
실제 순수 무력 차이가 2배라는 것과 나노초 단위라는 것이 별로 차이 없네라고 느낄 수 있는 결과였다
하지만 만약 db가 무거워진다면 어떤 결과를 가져올까?
728x90
반응형
'레디스' 카테고리의 다른 글
Redis Sentinel vs Redis Cluster: 고가용성과 확장성의 대결 (0) | 2023.09.19 |
---|---|
레디스 클러스터를 활용한 데이터 관리와 스프링 부트 연동: 클러스터 구성, 노드 설정, 조회 적용 및 실습 (0) | 2023.06.16 |
스프링 부트와 레디스를 활용한 데이터 저장 및 관리: 싱글 레디스 설정, Another Redis Desktop Manager 사용, 간단한 조회 예제 (0) | 2023.06.16 |
레디스(Redis)를 활용한 네띠 채팅 프로그램 구축: 간단한 적용 방법과 실시간 메시지 저장 (0) | 2023.03.05 |
Redis를 쓰는 이유 및 장점 (0) | 2023.03.05 |
댓글