** 개인적인 학습내용으로 정확하지 않은 부분들이 있을 수 있습니다.

Redis란?

  • Redis는 Key-Value 기반의 인메모리 데이터베이스입니다.
  • 주요 특징
    • Key-Value 기반
    • 인메모리
    • 고성능
    • 다양한 데이터 타입 지원
      • String, Sets, Sorted Set, Lists ...
    • 싱글 스레드

Redis 용도 예시

  • 캐싱
  • 세션 관리
  • 메시지 브로커
  • 게시물 랭킹
  • 게임 점수 관리

Redis 명령어

# 데이터 생성
SET key value
# 데이터 조회
GET key
# 데이터 수정
SET key value
# 관리
FLUSHDB # 데이터베이스 초기화

Redis를 이용한 사용자 로그인 여부 확인

  • 사용자 토큰 인증
    • 사용자의 token을 다음과 같은 형태로 저장한다.
    • key : users:token:<tokenValue> value : 토큰 관련 정보
    • 사용자가 로그인 하면 다음과 같이 토큰 정보를 생성합니다.
    • redisTemplate.opsForHash().put("users:token", tokenValue, tokenInfo);
    • 사용자가 로그인 여부를 확인
    • TokenInfo tokenInfo = redisTemplate.opsForHash().get("users:token", tokenValue); if(tokenInfo == null) return null; // 이외 토큰 유효성 판별 ...

Redis 캐싱 전략

  • Cache Aside 패턴
    • Flow
      • Cache Store에 검색하는 데이터가 있는지 확인
      • Cache Store에 없을 경우 Data Store에 데이터 조회
      • Data Store에 조회 해온 데이터를 Cache Store 에 업데이트
    • 읽기 및 반복적 호출 적합
    • 장애 대비
      • Redis가 다운 되더라도 DB에서 데이터를 가져 올 수 있어 서비스 자체는 문제가 없음
      • 단 레디스가 다운된 순간, 순간적으로 DB로 몰려서 DB 부하 가능성
    • 정합성 문제
      • Cache Store와 Data Stroe가 가지고 있는 데이터가 서로 다름
      • 캐시 만료 시간 설정: 캐시의 만료 시간을 설정하여 캐시된 데이터가 오래되면 데이터베이스에서 데이터를 다시 읽도록 합니다.
      • 캐시 무효화: 캐시된 데이터가 변경되면 데이터베이스에서 데이터를 다시 읽어 캐시를 무효화합니다.
      • 데이터베이스 트랜잭션 사용: 데이터베이스에서 데이터를 변경하는 트랜잭션을 사용하면 캐시된 데이터도 자동으로 업데이트됩니다.
  • Read Through 패턴
    • Flow
      • Cache Store에 검색하는 데이터가 있는지 확인
      • Cache Store에 없을 경우 Data Store에 데이터 조회
      • Data Store에 직접 Cache Store 에 업데이트
    • Read Through 방식은 Cache Aside 방식과 비슷하지만 Cache Store 에 저장하는 주체가 Server 또는 Data Store 에서 차이점 존재 Cache Aside 방식은 Data Store 로부터 서버가 쿼리 결과를 얻고나서 캐시에 저장
    • Read Through 패턴은 초기 데이터는 cache miss 가 항상 발생한다는 단점을 커버할 수 있도록 애플리케이션 측면에서 캐시 대상을 판단하여 Data Store 저장 (Commit) 시 Cache Store 에 쿼리를 동일하게 자동 수행하도록 설정
    • 정합성 문제
      • Cache Store와 Data Stroe가 가지고 있는 데이터가 서로 다름
      • 캐시 만료 시간 설정: 캐시의 만료 시간을 설정하여 캐시된 데이터가 오래되면 데이터베이스에서 데이터를 다시 읽도록 합니다.
      • 캐시 무효화: 캐시된 데이터가 변경되면 데이터베이스에서 데이터를 다시 읽어 캐시를 무효화합니다.
      • 데이터베이스 트랜잭션 사용: 데이터베이스에서 데이터를 변경하는 트랜잭션을 사용하면 캐시된 데이터도 자동으로 업데이트됩니다.
  • Write Back 패턴
    • Flow
      • 모든 데이터를 Cache Store 에 저장
      • 일정 시간 후 Data Store에 저장
    • 큐 역할, 데이터 베이스에 대한 전체 쓰기를 줄 일 수 있어 해당 비용을 감소
    • 정합성 확보
    • 캐시 장애시 데이터 유실, 불필요한 리소스 저장
    • Write Back 패턴의 경우 Cache Store 가 데이터 저장소 역할을 하면서 동시에 Data Store 에 Write 부하를 줄이기 위한 Queue 역할을 겸하게 됨
      • 이로 인해 Database의 부하를 경감시킬 수 있다는 장점 있음
      • 대체로 쓰기 작업이 많은 경우 적용을 권고
  • Write Through 패턴
    • Flow
      • 모든 데이터를 Cache Store에 저장
      • 그리고 바로 Cache Stroe에서 DB로 저장
    • 항상 동기화 되어 있어 데이터베이스에 작성할 때마다 캐시에 데이터를 추가
    • 캐시와 백업 저장소에 업데이트를 같이 하여 데이터 일관성을 유지할 수 있어서 안정적
    • 데이터 유실이 발생하면 안 되는 상황에 적합
    • 단 속도가 느린 기억장치에 데이터를 기록할 때 CPU가 대기하는 시간이 필요하기 때문에 성능이 떨어짐
    • Wrtie Through 패턴은 Cache Store 에도 반영하고 Data Store에도 동시에 반영하는 방식
    • Write Back은 일정 시간을 두고 나중에 한꺼번에 저장
    • 그래서 항상 동기화가 되어 있어 항상 최신정보를 가지고 있다는 장점이 있음
    • 하지만 결국 저장할 때마다 2단계 과정을 거쳐치기 때문에 상대적으로 느리며 무조건 일단 Cache Store 에 저장하기 때문에 캐시에 넣은 데이터를 저장만 하고 사용하지 않을 가능성이 있어서 리소스 낭비 가능성이 있음
    • 이 역시 이를 해결하기 위해 TTL을 꼭 사용하여 사용되지 않는 데이터를 반드시 삭제해야 함

'Study > BE' 카테고리의 다른 글

Docker / Docker-Compse  (2170) 2023.08.28

+ Recent posts