Redis
키-값 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈 소스 기반의 비관계형 데이터베이스 관리 시스템
인메모리 구조를 활용하기에 데이터 처리 성능이 굉장히 빠르다.
사용 사례
캐싱 전략
Cache: 원본 저장소보다 빠르게 가져올 수 있는 임시 데이터 저장소를 의미한다.
읽기 전략
- Look Aside (Cache Aside)
- 데이터를 찾을 때 우선 캐시에 저장된 데이터가 있는지 먼저 확인하는 전략. (캐시에 데이터가 없으면 DB에서 조회)
- Cache Store에 검색하는 데이터가 있는지 확인 (cache hit)
- Cache Store에 없을 경우 DB에서 데이터 조회 (cache miss)
- DB에서 조회해온 데이터를 Cache Store에 업데이트
- 반복적인 읽기가 많은 호출에 적합
- 캐시와 DB가 분리되어 가용되기 때문에 원하는 데이터만 별도로 구성하여 캐시에 저장
- Read Through 패턴
- 캐시에서만 데이터를 읽어오는 전략
- Cache Store에 검색하는 데이터가 있는지 확인 (cache hit)
- Cache Store에 없을 경우 캐시에서 DB에 데이터를 조회하여 자체 업데이트 (cache miss)
- Cache에서 데이터를 가져옴
- Look Aside 와 비슷하지만 데이터 동기화를 라이브러리 또는 캐시 제공자에게 위임하는 방식이라는 차이가 있음.
쓰기 전략
-
Write Around 패턴
- Write Through 보다 훨씬 빠름
- 모든 데이터는 DB에 저장 (캐시를 갱신하지 않음)
- Cache miss가 발생하는 경우에만 DB와 캐시에도 데이터를 저장
- 따라서 캐시와 DB내의 데이터가 다를 수 있음
-
Write Back 패턴
- 데이터를 저장할 때 DB에 바로 쿼리하지 않고, 캐시에 모아서 일정 주기 배치 작업을 통해 DB에 반영
- 캐시에 모아놨다가 DB에 쓰기 때문에 쓰기 쿼리 회수 비용과 부하를 줄일 수 있음
- Write가 빈번하면서 Read를 하는데 많은 양의 Resource가 소모되는 서비스에 적합
- 데이터 정합성 확보
- 캐시에서 오류가 발생하면 데이터를 영구 소실함
-
Write Through 패턴
- 데이터베이스와 Cache에 동시에 데이터를 저장하는 전략
- 데이터를 저장할 때 먼저 캐시에 저장한 다음 바로 DB에 저장
- 캐시와 백업 저장소에 업데이트를 같이 하여 데이터 일관성을 유지할 수 있어서 안정적
- 매 요청마다 두 번의 Write가 발생하게 됨으로써 빈번한 생성, 수정이 발생하는 서비스에서는 성능 이슈 발생
예시
@Cacheable(cacheNames = "getBoards", key = "'boards:page:' + #page + ':size:' + #size", cacheManager = "boardCacheManager")
public List<Board> getBoards(int page, int size) {
Pageable pageable = PageRequest.of(page - 1, size);
Page<Board> pageOfBoards = boardRepository.findAllByOrderByCreatedAtDesc(pageable);
return pageOfBoards.getContent();
}
@CacheEvict(cacheNames = LIKE_COUNT, key = "#userId", cacheManager = "cacheManager")
public void deleteLike(Long userId, Long id) {
likeRepository.deleteLike(userId, id);
}
@Cacheable: 읽기 작업을 수행하는 메서드에 사용되는 어노테이션
- cacheNames: 저장될 캐시 이름을 설정한다.
- key: 동적으로 달라지는 메서드의 파라미터 값을 선언한다.
- cacheManager: 캐시 설정 클래스의 메서드 이름을 사용한다.
@CacheEvict: 저장된 캐시를 제거할 때 사용된다.
참고자료: https://hstory0208.tistory.com/entry/Spring-Redis-Redis-cache%EB%A5%BC-%EC%A0%81%EC%9A%A9%ED%95%B4-%EC%A1%B0%ED%9A%8C-%EC%84%B1%EB%8A%A5-%EA%B0%9C%EC%84%A0-%EB%B0%A9%EB%B2%95