80%의 결과는 20%의 원인으로 인해 발생된다는 법칙으로 캐시가 나오게 된 배경에 이 법칙이 존재한다. 서비스에 필요한 20%를 캐싱함으로써 전체적인 효율을 끌어올릴 수 있다.
캐시란, 데이터의 원본보다 더 빠르고 효율적으로 액세스할 수 있는 임시 데이터 저장소이다.
자주 조회되며 데이터의 변경이 적은 데이터는 데이터 갱신으로 인해 DB와 불일치될 확률이 적기때문에 캐시를 적용하기 적합하다. 또한 데이터의 최신화가 실시간으로 이루어지지 않아도 괜찮은 데이터는 캐시와 DB사이 불일치가 길어도 괜찮기 때문에 적합하다.
캐시를 사용함으로써 서버간 불필요한 트래픽을 줄일 수 있으며, 부하가 감소된다.
로컬 캐싱이란, 로컬 장비 내에서 사용되는 캐시 메모리를 이용하는 방식이다.
글로벌 캐싱이란, 여러 서버에서 별도의 서버의 인메모리 DB(ex. Redis)에 저장된 캐시를 이용하는 방식이다.
일반적으로 캐시는 DB보다 훨씬 빠르게 데이터를 응답할 수 있다.
하지만 캐시의 용량이 DB보다 적기 때문에, 데이터를 모두 캐시에 저장해버린다면 용량 부족 현상이 일어난다.
따라서 어떤 데이터를 캐시에 저장할지, 얼만큼 데이터를 캐시에 저장할지, 얼마나 오래된 데이터를 캐시에서 제거할지에 대한 전략이 중요하다.
캐시를 이용할 때 데이터 불일치 문제를 고려할 필요가 있다.
한 데이터가 캐시와 DB 두 곳에서 같은 데이터임에도 그 값이 다른 경우를 말한다.
따라서 적절한 캐시 읽기 전략과 쓰기 전략을 통해 데이터 불일치 문제를 극복해야 한다.
Look Aside(Cache Aside) 패턴은 가장 기본적인 캐시 전략으로, 데이터를 찾을 때 우선 캐시에 저장된 데이터가 있는지 우선적으로 확인하고 데이터가 없다면 DB에서 조회한다.
이 방식은 초기 조회 시 무조건 DB에서 조회해야 하므로 단건 호출 빈도가 높은 서비스보다는 반복적으로 동일 쿼리를 수행하는 서비스에 적합하다. (초기에 DB에서 캐시로 data를 미리 넣어주는 Cache Warming을 통해 초기 성능 저하를 어느정도 방지할수도 있다.)
Read Through 패턴은 캐시에서만 데이터를 읽어오는 전략으로, Look Aside와 비슷하지만 캐시에 데이터 동기화를 위임해, 캐시에 데이터를 업데이트하는 주체가 서버냐 DB냐에 차이가 있다. 그리고 Look Aside와 달리 항상 캐시와 DB간 데이터 동기화가 항상 이루어져 데이터 불일치 문제에서 벗어날 수 있다.
이 방식 또한 Cache Warming을 수행하는 것이 효율적이나 데이터를 조회하는 데 있어 상대적으로 속도가 느리다.
Write Back (Write Behind) 패턴은 캐시와 DB를 비동기로 하기 때문에 동기화 과정이 생략되며, 데이터를 저장할 때 DB에 바로 쿼리하지 않고, 캐시에 모아서 일정 주기로 DB에 반영한다.
이 방식은 캐시에 데이터를 모았다 한번에 DB에 저장하기 때문에 DB 쓰기 비용과 부하를 줄일 수 있지만, DB에 데이터를 쓰기 전에 캐시에 장애가 발생하면 데이터 유실이 발생 가능하다.
Write Through 패턴은 DB와 캐시에 동시에 데이터를 저장하는 전략으로, 데이터를 저장할 때 먼저 캐시에 저장하고 바로 DB에 저장한다. Read Through와 같이 DB 동기화 작업을 캐시에 위임한다.
이 방식은 DB와 캐시가 항상 동기화 되어있어, 데이터의 일관성을 유지할 수 있다. 하지만 저장에 2단계 과정을 거치므로 상대적으로 속도가 느리다.
Write Around 패턴은 모든 데이터를 DB에 저장하는 전략으로 캐시를 갱신하지 않는다.
이 방식은 데이터를 DB에만 저장하므로 속도가 빠르지만, 캐시와 DB간 데이터 불일치 문제가 발생 가능하다.
가장 일반적으로 자주 쓰이는 조합이다.
항상 DB에 쓰고, 캐시에서 읽을 때 항상 DB에서 먼저 읽어오므로 데이터 불일치 문제에 대해 완벽한 안전 장치를 구성할 수 있다.
데이터를 쓸 때 항상 캐시에 먼저 쓰므로, 읽어올 때 최신 캐시 데이터가 보장된다.
또한 데이터를 쓸 때 항상 캐시에서 DB에 보내므로 데이터의 정합성이 보장된다.