기타

Redis 를 어디에 쓸까

whyHbr 2025. 1. 10. 00:11
728x90
반응형

Redis필요한 곳

  • 캐시 
  • In menory  를 DB로 사용하는곳
  • Ranking 저장용
    • Ex) 게임 랭킹에 맞춰 게임을 매치, 실시간으로 변경되는 랭킹 순
  • Job Queue
    • Rabbit MQ, Kafka

사용 예

  • Cache: Web API 의 요청을 Key 로 응답을 Value 에 저장
  • 서비스의 Access Token 저장
  • 요청 수 제한을 위한 Rate Limit
  • Ranking 저장을 위한 Ranking 스코어 보드

 

캐시

  • 같은 요청에 대해 같은 결과를 제공 할 때, 작업에 대한 결과를 계산해 두었다가 재요청이 오면 계산 없이 바로 돌려주는 것
    • ex) 이미 봤던 페이지를 DB 접근 없이바로 볼 수 있다.
  • Reduces the distance from Resource 사용할 리소스와의 거리를 줄여준다.
  • 캐시가 유용한 케이스
    • 적은 데이터가 빈번하게 접근 될 때 유용 = 특정 데이터만
  • DB에 요청을 줄일 수 있어 성능 향상 가능. 

In memory 

  • 장점
    • 접근 속도가 빠르다. SSD, HDD를 쓰는 것보다 속도가 빠름.
  • 단점
    • 다른 스토리지에 비해 저장 용량이 작고 비싸다.
      • SSD 와 대략 20배 이상 차이가 난다.

성능이 중요할 때 사용한다.

파레토의 법칙에 의하면, 20%의 유저들이 80% 활동을 하기에 20% 를 캐시하면 서비스 대부분의 데이터를 커버할 수 있다.

 

어디에 캐시를 쓸까?

  • ex) API 응답

고민해야 할 것

  • 캐시를 적용해도 되는 API 인지
    • 자주 바뀌는 값은 안하는게 좋다.
    • 쓰기 API 는 캐시를 적용하는 것이 애매하다
    • 읽기 API 가 유리하다.
      • 읽기용이라 쓰기가 하나도 발생하지 않나?
  • Key는 어떻게 정의할 것인지
    • Key 는 데이터를 구분하는 유일한 값이므로 Key 값은 유일해야 한다.
    • 유니크한 키 값을 만들어줘야 한다.
      • userId, age, date 등등 
    • Access Token를 캐시 한다면,  Access Token자체가 유효하므로 특별하게 정보를 추가하지 않아도 된다.
    • prefix를 추가하는 것이 좋다.
  • Value 는 어떻게 정의할 것인지
    • 두가지 전략이 있다
      • 응답결과를 그대로 저장한다. 
        • 응답 결과가 항상 바뀌는 값이 없다면, 그대로 저장 가능하다
      • 실제 데이터 부분만 저장
        • 응답 결과의 일부분이 바뀌어야 한다면, DB에 저장된 데이터를 저장하고, 이를 토대로 응답을 새로 만든다.
      • user의 정보를 캐시 한다면: User Id,User 권한 
      • cache 사용 예시
        • 서비스에서 매번 로그인 하는 것을 피하기 위해 Access Token을 사용한다.
          • Access Token은 유효 기간이 존재하므로, 탈취 되어도 일정 시간 이후엔 사용 할 수 없다.
        • 보통 Access Token에 대응하는 유저 정보가 DB에 존제한다.
        • JWT 의 경우에는 해당 키가 유용한지 여부만 저장하고, 실제 유저 정보는 JWT 안에 저장하는 경우가 많다.
    • Rate Limit 사용 예시
      • 오픈 API 나 외부 특정  API 를 제공하는 서비스의 경우, 시간당 몇 회 호출, 하루 호출 수 제한을 걸어두는데 이를 구현하는데도 Redis가 많이 사용된다.
    • Rate Limit 사용 하는 이유?
      • 과도한 트래픽으로부터 서비스를 보호
      • Resource 사용에 대한 공정성과 합리성 유도
      • 트래픽 비용이 서비스 예산을 넘는 것을 방지
      • Rate 에 대해 과금을 부과하는  Business model로 활용
    • Rate Limit 의 키를 어떻게 정의해야할까
      • 특정 기간에 N회라는 제한.
      • N회는 지속적으로 바뀌는 값이므로, key 에 반영되기 어려움.
      • API 가 여러개라면 API 종류 값이 들어가야함
        • ex) api.maps
      • 유저별로 개수 제한이 존재하므로 user id가 필요함
        • api:maps:1234
      • 그런데 중요한 특정 기간의 정보가 필요함
        • 고려할 점
          • 5분마다 10회라고 한다면, 이 5분을 연속적5분으로 볼 것인가? 아니라면 0~5 분, 5분 00초 부터 10분까지로 볼 것인가 에 따라 구현 방식이 달라진다.
          •  시간이라는 정보는 계속 바뀌지만, 해당 시간이라는 정보는 바뀌지 않음.
            • 5분마다 N회를 위해 매분마다 호출 회수를 기록함
            • api:maps:1234:20240110 <- YYYYmmddHHMM
            • 현재 시간에서 이전 5분 데이터를 가져와 개수를 세어보는 것으로 처리 가능
              • 2024년 1월 10일 12시 9분 에 접속히면 5개의 key를 가져온다
      • Rate Limit value 는 어떻게?
        • 호출 회수만 저장하면 된다.

 

 

 

 

 

 

728x90

'기타' 카테고리의 다른 글

Redis란  (0) 2025.01.08
대규모 서비스란  (0) 2025.01.05
redis 데이터 구조 학습  (1) 2024.12.02
퀴즈 9회차  (0) 2024.05.02
퀴즈 8회 오답노트  (0) 2024.04.26