캐시 기본과 캐시 계층
캐시가 통하는 근거는 지역성입니다. 최근에 쓴 것이 또 쓰이기 때문에 소수를 담아두고도 적중률이 높아집니다.
캐시 기본과 캐시 계층
캐시가 통하는 조건
- 읽기가 쓰기보다 훨씬 많다 (읽기:쓰기 10:1 이상)
- 접근이 일부 데이터에 집중된다 (상위 20% 키가 트래픽 대부분)
- 약간 낡은 데이터를 허용할 수 있다
- 원본 조회가 비싸다 (복잡한 조인, 외부 API 호출)
요청 경로의 캐시 계층
[브라우저 캐시]
|
[CDN / 엣지]
|
[앱 로컬 캐시]
|
[Redis 등 분산 캐시]
|
[DB 버퍼 풀] -> [디스크]
캐시를 넣기 전에 확인할 것
캐시는 공짜가 아닙니다. 넣으면 낡은 값이 보이는 구간과 무효화할 자리가 생깁니다. 그래서 이득이 그 비용을 넘는지 먼저 봅니다.
| 확인 | 넘지 않으면 |
|---|---|
| 읽기가 쓰기보다 훨씬 많은가 | 무효화가 잦아 이득이 사라진다 |
| 조회가 소수에 몰려 있는가 | 적중률이 낮아 왕복만 늘어난다 |
| 낡은 값을 얼마간 허용하는가 | 허용하지 않으면 캐시를 둘 수 없다 |
| 원본 조회가 비싼가 | 값싸면 캐시 왕복이 오히려 손해다 |
세 번째가 결정적입니다. 얼마나 낡아도 되는지가 곧 수명이고, 그 값이 0이면 캐시가 아니라 다른 방법을 찾아야 합니다.
적중률이 낮을 때 무엇을 의심하나
메모리를 늘리는 것은 마지막입니다. 그 앞에 볼 것이 있습니다.
키가 너무 세분화돼 있지 않나: 사용자마다 다른 키면 재사용이 없다
수명이 너무 짧지 않나: 쓰이기 전에 사라진다
캐시할 대상이 아닌 것을 담지 않았나: 조회가 고르게 퍼진 데이터
키 설계가 적중률의 대부분을 정합니다. 같은 답을 여러 사용자가 쓸 수 있게 키를 묶으면 적중률이 크게 오릅니다. 반대로 키에 사용자 정보를 넣으면 재사용이 사라집니다.
실무 포인트
- 히트율 = hits / (hits + misses). Redis는
INFO stats의keyspace_hits/keyspace_misses로 계산 - 히트율이 낮으면 메모리 증설보다 키 설계와 TTL을 먼저 의심한다
- 쓰기가 잦은 데이터를 캐싱하면 무효화 비용이 이득을 넘는다
- 캐시는 원본을 대신하지 못한다. DB가 죽으면 캐시만으로 오래 버티지 못한다
- Q.캐시를 도입하기 전에 무엇을 먼저 확인해야 하나요?
- Q.캐시 히트율이 낮을 때 어떤 순서로 원인을 찾나요?
- Q.캐시에 넣으면 안 되는 데이터는 어떤 것인가요?