본문 바로가기
트러블슈팅과 고민/고민

실시간 인기글의 캐시 갱신시 빈 페이지 반환에 대한 개선 (스케줄러, 캐시어사이드 동시 사용)

by 정재익 2026. 1. 27.

캐시전략은 백그라운드 갱신, 라이트 어라운드, 캐시 무효화이다.
실시간은 더해서 캐시 어사이드도 사용한다.

게시글 수정과 삭제시 캐시를 삭제한다.
캐시 무효화를 쓴 이유는 수정이 되었을 때 글 내용이 달라지는 것은 비즈니스에 타격을 준다고 생각했기 때문이다.

 

 

백그라운드 갱신을 한 이유는 빈페이지 반환을 막기 위해서다. 조회시마다 캐시 갱신을 하면 대용량 트래픽의 디비 접근을 막기 위해서 빈페이지를 반환할 수 밖에 없다. 핫 키를 계산하여 미리 갱신할 수 있지만 어쨌거나 핫 하지 않은 키는 빈페이지를 받는다. 키가 많으면 레디스의 보호를 위해 락이 있어도 핫 키를 계산해야하지만 키가 몇개 없어서 핫 키계산은 현재 사용안한다.

 

실시간 인기글의 스케줄러 갱신의 어려움

하지만 실시간인기글은 이 방법을 사용할 수 없다 스케줄러로 갱신하게 되면 스케줄러의 갱신 텀인 1분마다 캐시가 최신화가 되어서 실시간이 아닌 1분 인기글이다. 때문에 조회시에 갱신해야해야하는데 갱신시에 빈 페이지를 피하기 위해서 싱글플라이트를 쓰기에는 서버의 자원이 작아서 스레드풀의 점유를 걱정했다.

 

하지만 빈 페이지를 반환하기는 싫었다. 그렇기에 TTL을 무한으로 설정하여 캐시 미스가 나지않게했다. 다만 이렇게만하면 실시간 인기글의 신선도를 보장할 수 없다. 때문에 스케줄러 갱신을 통해 1분마다 갱신하게 했지만 스케줄러 장애시 갱신이 안된다. 된다고 해도 실시간이 아닌 1분 인기글이 되어 버린다.

 

그렇기에 조회시 갱신 로직도 같이 설정했다 그러면 조회시에도 zset과 hash를 비교해서 캐시 갱신을 하여 실시간이 될 수 있으며 이때 락을 획득하지 못한 스레드는 과거 캐시를 받아가는데 만약 그 과거가 너무 과거라면 그것또한 실시간이 아니다 하지만 이부분은 스케줄러 갱신이 막아준다. 그래서 락을 획득하지 못한 스레드도 최대 1분전의 실시간은 받아가도록했다.

 

참고로 기존에 활용하던 PER은 제거했다. 원래 캐시 미스시 앞단에 두어서 캐시완화를 하려했지만

 

초당 100개 요청시
캐시갱신 0.1초 평균동시타격 1.3스레드
캐시갱신 0.2초 평균동시타격 1.7스레드
캐시갱신 1.0초 평균동시타격 7.5스레드

초당 1000개 요청시
캐시갱신 0.1초 평균동시타격 2.4스레드
캐시갱신 0.2초 평균동시타격 4.4스레드
캐시갱신 1.0초 평균동시타격 45스레드

초당 5000개 요청시
캐시갱신 0.1초 평균동시타격 4.9스레드
캐시갱신 0.2초 평균동시타격 12스레드
캐시갱신 1.0초 평균동시타격 190스레드

초당 10000개 요청시
캐시갱신 0.1초 평균동시타격 7.5스레드
캐시갱신 0.2초 평균동시타격 20.7스레드
캐시갱신 1.0초 평균동시타격 366스레드

초당 50000개 요청시
캐시갱신 0.1초 평균동시타격 24.6스레드
캐시갱신 0.2초 평균동시타격 81.7스레드
캐시갱신 1.0초 평균동시타격 1737스레

 

초당 100개면 1초이면 7.5개다 초당 요청수가 많으면 더 상승한다 락프리라는 장점이 있지만 락이 있으면 하나가 들어갈 것을 여러개가 들어가게 두는거같았다. 또한 캐시 갱신때 쓰는 비동기스레드포화도 걱정이었다. 요청수가 적을땐 PER을 앞단에 두는것이 효과적 일거같긴하다.