[Redis] 레디스 캐시를 사용하면 조회 성능이 몇 배 정도 빨라질까? (@Cacheable)
1. 레디스 캐시 안 썼을 때 조회 시간
SecuritySupportSvcImpl
@Override
public List<ComRoleUserDto> getLoginUserRole(String userId) {
return securitySupportDao.getLoginUserRole(userId);
}
컨트롤러
@GetMapping("/mapg")
public List<ComRoleUserDto> getLoginUserRole() {
final List<ComRoleUserDto> list = securitySupportSvc.getLoginUserRole("admin");
return list;
}
호출을 하면 64초 정도가 나온다. 여러번 호출해봐도 비슷하다.
2. 레디스 캐시 썼을 때 조회 시간
SecuritySupportSvcImpl
@Cacheable(value = "cacheNameTest") // 🎯 추가 !!
@Override
public List<ComRoleUserDto> getLoginUserRole(String userId) {
return securitySupportDao.getLoginUserRole(userId);
}
10초 대로 확 줄었다. 원래는 DB에서 많은 데이터를 긁어와서 테스트를 해봐야하지만, 귀찮아서 이 정도로만 테스트 ^^;
그리고 한 번 호출 시, 캐시 이름이 생성되는지도 확인해보았다.
// 모든 캐시의 키 밸류 가져오기
@GetMapping("/allCacheKeyValue")
public Map<String, Object> getAllCacheValues() {
Map<String, Map<Object, Object>> allCacheValues = new HashMap<>();
final HashMap<String, Object> map = new HashMap<>();
// 모든 캐시 이름을 조회
for (String cacheName : cacheManager.getCacheNames()) {
map.put(cacheName, cacheName);
}
return map;
}
한 번 호출을 하면,
없었던 ‘cacheNameTest’가 생기는 것도 확인할 수 있었다!
@Cacheable어노테이션을 붙이고 호출을 하면 1번째 호출할 때는 DB에서 가져와 캐시에 저장해놓고,
2번째 호출부터는 해당 캐시에서 데이터를 가져오기 때문에 빨라지는 것이다.
레디스 UI 에서도 cachNameTest 란 Key 값으로 캐시가 저장된 것을 확인할 수 있다.
결론
@Cacheable 을 쓰자.
조회 속도가 6배 정도 빨라졌다. (물론 대용량 데이터로 다시 실험해봐야 하지만...다른 테스트 블로그 보면 대용량 데이터는 3배 정도 빨라지는 것 같다.)
스프링부트는 기본적으로 ConcurrentMapCache를 지원해준다. 아무것도 의존성 추가하지 않아도 그냥 쓸 수 있다.
레디스 캐시를 사용하고 싶으면,
pom.xml 파일에 ‘스프링부트 스타터 데이터 레디스’ 추가하면, 자동으로 기본 캐시가 ConcurrentMapCache 에서 RedisCache 로 설정된다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>3.3.1</version>
</dependency>
이렇게만 해도 기본적인 캐시는 사용 가능하다. 더 세부적인 설정은 물론 RedisCacheConfiguration을 따로 빈등록 해주어야 한다.
나는 레디스설정까지 모두 추가하여 레디스캐시로 사용하였다.
레디스 캐시로 조회는 처음 사용해보는데, 앞으로 자주 애용해야 겠다!
조회 엄청 빨라지는 레디스 캐시 개꿀~~~😍