캐시란?

요청에 대한 응답의 복사본을 어딘가에 저장해놓고, 같은 요청이 들어오면 (서버에) 재요청하지 않고 저장한 복사본 데이터를 보내주는 것.

어떤 요청인가?

유저의 GET요청. 보통 POST요청은 캐시하지 않는다. 일반적으로 200, 301, 404 응답을 캐싱한다.

어디에 저장하나?

프록시 서버에 생성된 캐시 메모리 또는 클라이언트의 개인적인 공간(브라우저 등)에 저장한다. 이는 추후 설명하게 될 공유캐시(Public)/사설캐시(Private)가 된다.

왜 이런 행위(캐시)가 필요하나?

원본 데이터가 있는 곳은 원본 서버(Origin Server)라고 한다. 웹에서 클라이언트는 브라우저에서 요청을 시작한다. 브라우저를 통한 요청은 서버로 향하는데, 이때 오리진 서버로 가는 행위는 시간과 자원이 오래 걸린다. 그래서 그 사이에 캐시메모리라는 공간을 두고, 만약 클라이언트가 동일한 요청을 했고 그 요청에 대한 응답이 동일하다면, 굳이 서버까지 가지 않고 중간에 캐시메모리에서 데이터를 찾아서 던져주기로 한다. 클라이언트는 똑같은 상태의 데이터를 이전보다 더 빨리 받게 된다. 서버는 자원을 아끼고, 클라이언트는 응답을 더 빨리 받고 클라이언트, 서버 둘다 윈윈이다.

Untitled

그러나 캐시메모리에는 명확한 제한이 있는데, 바로 크기다. 일시적으로 복사본을 저장하는 공간인 만큼 서버의 아주 작은 공간만을 할당 받는다.

그래서 캐시메모리가 다 차면 안에 있는 데이터를 삭제하여 공간을 만들고, 새로운 요청에 대한 응답을 다시 저장하는데 이때 어떤 데이터를 삭제할 것인지가 중요해지는데, 이를 결정하는 로직이 캐시 알고리즘이 있다.

캐시 알고리즘

캐시 교체 정책이라고도 하며, LRU, LFU, FIFO 등 여러 알고리즘이 있지만 LRU가 가장 많이 쓰인다.

LRU(Least Recently Used)

캐시메모리에서 사용된지 가장 오래된 페이지(— 캐시에서 각 데이터를 일컫는 말)를 지우는 방식

“오랫동안 쓰지 않은 데이터는 앞으로도 안쓸 것이다”라는 가정에서 나온 알고리즘이으로, 구현이 쉽고 가장 보편적인 방법이다.

<aside> 📌 LRU 알고리즘

  1. 요청이 들어온다.
  2. 캐시에 없는 데이터면 원본 서버에서 데이터를 가져온 후 응답해주면서 캐시에 저장한다.
  3. 캐시에 있는 데이터면 캐시에서 빼서 준다.
  4. 캐시에 없는 데이터를 요청하는데 캐시가 다 찼을 경우, 가장 마지막에 쓰인 데이터를 지우고 방금 요청한 캐시를 가장 뒤(tail)에 둔다.
  5. 캐시에 있는 데이터 요청 시 해당 데이터를 가장 뒤(tail)로 옮기고 응답한다.

</aside>