본문 바로가기
레디스

레디스를 캐시로 사용하여 조회하는것과 DB에서 데이터를 조회하는 것의 차이를 실험으로 알아보자

by 플라퉁 2024. 6. 15.
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
반응형

댓글