본문 바로가기
카테고리 없음

Redis 캐시 스탬피드 현상

by 진믈리 2024. 11. 22.

캐시 스탬피드란?

레디스의 look-aside 방식에서 여러 개의 애플리케이션에서 바로보던 키가 레디스에서 만료돼 삭제되어 서버들이 한꺼번에 데이터베이스에서 데이터를 읽어오는 과정 이를 중복 읽기라 한다. 이후 중복 쓰기까지 발생하여 서비스의 이슈가 발생하고 한번 캐시 스탬피드 현상이 발생하면 더 많은 데이터가 이 현상의 영향을 받아 결과적으로 더 큰 문제로 이어질 수 있기에 계단식 실패라 한다.

 

해결 방법

PRE(Probabilistic) 알고리즘

currentTime - ( timeToCompute * beta * log(rand()) ) > expiry
  • currentTime : 현재 남은 만료 시간
  • TimeToCompute : 캐시된 값을 다시 계산하는 데 걸리는 시간
  • beta : 기본적으로 1.0 보다 큰 값으로 설정 가능
  • rand() : 0과 1 사이의 랜덤 값을 반환하는 함수
  • expiry : 키를 재설정할 때 새로 넣어줄 만료 시간
  • result > expiry : FALSE
  • result < expiry : TRUE

계산된 값이 expiry보다 크다면 false가 되고 작다면 true가 된다.

이 공식은 만료시간이 다가오면 다가 올수록 true를 반환할 가능성이 커진다. 이 공식을 활용하여 true가 나온다면 캐시가 만료되어 캐시 스탬피드 현상이 오기전에 미리 레디스의 데이터를 초기화 시키는 것이다. 

 

왜 log(rand())가 항상 음수인가?

1. rand()의 범위

  • rand()는 0과 1 사이의 값을 반환하는 함수입니다.
    • 즉, rand()의 범위는 0 < rand() < 1 입니다.
    • 예: rand()=0.5,0.8,0.01

2. 로그 함수의 성질

  • 로그함수 log(x) 에서:
    • log⁡(x) > 0 when x > 1
    • log⁡(x) = 0 when x = 1
    • log⁡(x) < 0 when 0 < x
  • 따라서, rand()가 항상 0 < rand() < 1 이므로:
    • log⁡(rand())는 항상 음수입니다.