캐시(Cache)와 캐싱 전략
캐싱 쓰기 전략에는 Write Back (Write Behind), Write Through, Write Around가 있다.
데이터 정합성 문제와 메모리를 고려해 캐싱 전략을 선택해야 한다.
📌 캐시(Cache)란?
데이터를 미리 저장해 두는 임시 장소를 말한다.
일반적으로 캐시 데이터는 RAM이나 인메모리 엔진에 저장된다.
이후에 해당 데이터에 대한 요청이 생겼을 때, 데이터 기본 저장소(디스크)로 접근하는 것보다 캐시 데이터로 접근하면 더 빠르게 요청을 처리할 수 있다.
캐시는 디스크보다 처리 속도가 빠르지만 저장 공간이 작고, 비용이 많이 든다.
📌 캐싱 전략
캐싱에 전략이 필요한 이유는 결국 데이터를 저장하는 곳이 2개이기 때문이다.
같은 데이터가 캐시와 데이터베이스 두 곳에 저장되면서, 서로 다른 값으로 저장되는 데이터 정합성 문제가 발생할 수 있다.
또한 위에서 말한대로 캐시는 저장 공간이 작으므로 데이터 관리에 주의해야 한다.
상황에 따라 이런 점들을 고려해서 캐싱 전략을 선택해야 한다.
캐싱 읽기 전략 1 - Look Aside Cache (Lazy Loading)
일반적으로 가장 많이 쓰이는 전략이다.
데이터를 조회할 때 캐시에 있는지 먼저 확인하고, 없을 경우 DB를 조회한다.
캐시에 없던 데이터를 가져온 Server는 캐시에 이 데이터를 업데이트한다.
단, 캐시를 새로 투입하거나 DB에만 새로운 데이터를 저장했다면 cache miss가 많이 발생해서 성능에 저하가 생길 수 있다.
DB에서 캐시로 미리 데이터를 밀어 넣어주는 작업인 Cache Warming을 통해 이를 해결할 수 있다.
이 전략은 캐시와 DB간 데이터 정합성 문제가 발생할 수 있다는 단점이 있다.
캐싱 읽기 전략 2 - Read Through
Look Aside 전략에서 발전된 방식이다.
나머지 과정은 동일한데,
캐시에 없던 데이터를 Server가 아닌 Data Store가 직접 캐시에 업데이트한다.
캐싱 쓰기 전략 1 - Write Back (Write Behind)
로그를 DB에 저장할 때 자주 쓰는 방식이다.
해당 전략을 사용하는 이유는 DB로 데이터 500개를 insert 해야 한다고 했을 때,
insert 쿼리 1개를 500번 날리는 것보다 쿼리 500개를 1번에 날리는 게 훨씬 더 빠르기 때문이다.
캐싱 쓰기 전략 2 - Write Through
DB에 데이터를 저장할 때 캐시에도 함께 저장하는 방식이다.
이 전략은 캐시가 항상 최신 정보를 가지고 있으므로 데이터 정합성 문제가 해결된다는 장점이 있다.
하지만 저장 과정이 느리고,
재사용되지 않는 데이터도 무조건 캐시에 들어가므로 리소스가 낭비될 수 있다.
캐시 데이터에 expire time을 설정해 주면 단점을 보완할 수 있다.
캐싱 쓰기 전략 3 - Write Around
DB에만 데이터를 저장하는 방식이다.
cache miss가 발생한 경우에만 캐시로 데이터를 가져온다.
캐시의 데이터와 DB의 데이터가 다를 수 있다.
참고