Logo wiki

캐시 스탬피드

April 2, 2025
2 min read
Table of Contents
index

정의

수많은 요청들이 동시에 캐시 미스를 확인하고 캐시 적재를 시도하는 현상입니다. 원본 DB와 캐시의 성능을 저하할 수 있습니다.

stampede : 큰 동물 무리가 흥분하거나 두려워서 같은 방향으로 갑자기 달려가는 것

해결 방법

잠금(Locking) 방식은 한 요청 처리 스레드가 해당 캐시 키에 대한 잠금을 획득합니다. 이로 인해 다른 요청 처리들은 잠시 대기합니다. 잠금을 사용하기 때문에 성능 저하 가능성이 있으며, 잠금 획득 스레드의 실패, 잠금의 생명 주기, 데드락 등 다양한 상황을 고려해야 한다는 단점이 존재합니다.

캐시 미스시가 아닌 캐시 만료 시간이 얼마 남지 않았을 경우, 캐시의 생성(갱신)을 수행하는 방법도 있습니다. 이 경우에도 시간만 앞당겨졌을 뿐 락을 사용해야 하기 때문에 성능 저하가 발생할 수 있습니다. 따라서, 일부 요청만 캐시 갱신을 할 수 있도록 random 확률을 적용하는 확률적 조기 재계산 방식(Probabilistic Early Recomputation)이 있습니다.

import math
import random
# 확률적 조기 재계산(PER) 방식
def should_refresh_cache(캐시_생성_소요_시간, 가중치: float = 1, remaining_ttl):
return 캐시_생성_소요_시간 * 가중치 * -math.log(random.random()) > remaining_ttl

참고 링크