쓰기 연산보다 읽기 연산이 많이 발생한다.
Look Aside
, 쓰기 전략은 Write Through
를 적용한다.초기에 데이터를 DB에만 저장했다면 처음엔 cache miss가 많기 때문에 성능 저하의 가능성이 있다.
그래서 DB에서 캐시로 data를 미리 넣어주는 Cache Warming 작업을 한다.
<장점>
<단점>
<장점>
<단점>
Redis Client에는 Jedis, Lettuce가 있다.
둘 모두 몇 천개의 Star를 가질만큼 유명한 오픈소스
이다.
어떤걸 선택할지 고민해보자.
<속도 차이>
Lettuce가 훨씬 빠르다.
빠른 속도, 비동기 지원으로 인해 Lettuce를 사용할 예정이다.
데이터 정합성을 위해 일정 주기마다 레디스 데이터 업데이트
DB에 저장 후 캐시에 저장
RedisCacheService.java
@Service
@RequiredArgsConstructor
public class RedisCacheService {
private final ReviewRepository reviewRepository;
private final RedisTemplate<String, Long> redisTemplate;
public Long getTotalReviewsByItemId(Long itemId, String cacheKey) {
Long cachedCount = redisTemplate.opsForValue().get(cacheKey);
if (cachedCount != null) {
return cachedCount;
}
long dbCount = reviewRepository.countByItem_ItemId(itemId);
redisTemplate.opsForValue().set(cacheKey, dbCount);
return dbCount;
}
}
ReviewService.java
@Transactional(readOnly = true)
public Long findTotalReviewsByItem(
final Long itemId
) {
Item foundItem = findItemByItemId(itemId);
String cacheKey = "item:" + foundItem.getItemId();
return redisCacheService.getTotalReviewsByItemId(foundItem.getItemId(), cacheKey);
}
데이터가 100만개 있는 상황에서 Jmeter를 이용해 테스트를 했다. itemId를 찾는 쿼리 + 해당 itemId에 따른 리뷰를 count하는 쿼리가 발생했다.
1, 3번은 데이터베이스를 거치지 않고 Redis에서 바로 데이터를 가져왔다.
2, 4번은 Redis에 데이터가 없기 때문에 데이터베이스에서 데이터를 가져왔다.
Redis에서 가져온 데이터 | DB에서 가져온 데이터 |
---|---|
12ms | 160ms |
10ms | 158ms |
결과적으로 속도가 10배 이상 개선되었다.
https://github.com/prgrms-be-devcourse/BE-04-NaBMart
https://inpa.tistory.com/entry/REDIS-📚-캐시Cache-설계-전략-지침-총정리
https://inpa.tistory.com/entry/REDIS-📚-데이터-타입Collection-종류-정리#redis_-_strings
https://www.baeldung.com/spring-boot-redis-cache
https://blog.naver.com/qjawnswkd/222403436289
https://m.blog.naver.com/qjawnswkd/222404574159
https://happy-jjang-a.tistory.com/178
Redis 테스트 환경
https://devoong2.tistory.com/entry/Springboot-Redis-테스트-환경-구축하기-Embedded-Redis-TestContainer
https://loosie.tistory.com/813#3.임베디드_Redis라이브러리_사용하기
Jedis, Lettuce
https://junghyungil.tistory.com/166
https://jojoldu.tistory.com/418
Jmeter