Redis Cache 전략

원승현·2024년 10월 22일

Redis

목록 보기
1/1
post-thumbnail

Redis

키-값 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈 소스 기반의 비관계형 데이터베이스 관리 시스템

인메모리 구조를 활용하기에 데이터 처리 성능이 굉장히 빠르다.

사용 사례

  • 캐싱
  • 세션 관리
  • 실시간 분석 및 통계 등

캐싱 전략

Cache: 원본 저장소보다 빠르게 가져올 수 있는 임시 데이터 저장소를 의미한다.

읽기 전략

  • Look Aside (Cache Aside)
    • 데이터를 찾을 때 우선 캐시에 저장된 데이터가 있는지 먼저 확인하는 전략. (캐시에 데이터가 없으면 DB에서 조회)
        1. Cache Store에 검색하는 데이터가 있는지 확인 (cache hit)
        1. Cache Store에 없을 경우 DB에서 데이터 조회 (cache miss)
        1. DB에서 조회해온 데이터를 Cache Store에 업데이트
    • 반복적인 읽기가 많은 호출에 적합
    • 캐시와 DB가 분리되어 가용되기 때문에 원하는 데이터만 별도로 구성하여 캐시에 저장
  • Read Through 패턴
    • 캐시에서만 데이터를 읽어오는 전략
        1. Cache Store에 검색하는 데이터가 있는지 확인 (cache hit)
        1. Cache Store에 없을 경우 캐시에서 DB에 데이터를 조회하여 자체 업데이트 (cache miss)
        1. 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

0개의 댓글