캐싱이란?
Caching == Cache + ing
Cache
프랑스어로 숨기다라는 뜻을 가지는 단어인 cacher에서 파생된 단어로 물건을 일시적으로 저장, 보관하기 위해 사용하는 곳을 의미한다.
기술적 Cache
자주 필요한 데이터나 값의 복사본을 일시적으로 저장, 보관하기 위해 사용하는 곳
Caching
Cache를 사용하는 것
캐시 메모리의 도입
CPU ↔ RAM ↔ Hard Drive
CPU
- 중앙 처리 장치
- 매우 빠름
- 기억장치에서 데이터를 받아들여 연산 작업
RAM
- 주기억장치
- 빠름
- 전원이 꺼지면 데이터가 지워짐
데이터를 주고받는 과정에서 CPU와 RAM의 데이터 처리 속도 차이에 의해 CPU가 메모리를 기다려야 하는 병목 현상이 발생
👉 이러한 문제를 해결하기 위해 CPU와 메임 메모리 사이에 크기는 작지만 속도가 빠른 캐시 메모리를 두고 캐시 메모리에 향후 재상용할 가능성이 클 것으로 예상되는 데이터의 복사본을 저장해 둔 후 CPU가 요청하는 데이터를 바로바로 전달할 수 있도록 한 것이 캐싱이다
한 계층은 바로 아래 계층에 대하여 캐싱 작업을 수행할 수 있는데 캐싱이란 메모리 계층 구조의 핵심으로 캐싱을 이용하여 빠르고 작은 메모리와 크고 느린 메모리의 장점을 종합해 크고 빠른 메모리처럼 행동하도록 만드는 것이다
캐싱 동작 원리
재사용성이 큰 데이터는 어떻게 알 수 있을까?
-
데이터 지역성의 원리
데이터 지역성의 원리란 데이터 접근이 시간적 혹은 공간적으로 가깝게 일어나는 것을 의미함
한 번 참조된 변수는 잠시 후에 또 참조될 가능성이 높다.
어떤 데이터에 접근할 때 그 데이터 근처에 있는 다른 데이터도 참조될 가능성이 높다.
- 시간적 지역성 특정 데이터가 한 번 접근되었을 경우 가까운 미래에 또 한 번 데이터에 접근할 가능성이 높은 것 메모리 상의 같은 주소에 여러 차례 읽기 쓰기를 수행할 경우 상대적으로 작은 크기의 캐시를 사용해도 효율성을 높일 수 있음 ex. for나 while문의 조건 변수 i
- 공간적 지역성 특정 데이터와 가까운 주소가 순서대로 접근되는 경우 한 메모리 주소에 접근할 때 그 주소뿐 아니라 해당 블록을 전부 캐시에 가져옴 이 때 메모리 주소를 오름차순이나 내림차순으로 접근한다면 캐시에 이미 저장된 같은 블록의 데이터를 접근하게 되므로 캐시의 효율성이 크게 향상될 수 있음 ex. 배열은 순서대로 접근할 가능성이 크다
-
캐시 히트와 캐시 미스
캐시 메모리가 해당 데이터를 가지고 있다면 캐시히트 해당 데이터가 없어서 메인 메모리에서 가져와야 한다면 캐시 미스
-
캐시 메모리 쓰기 정책과 캐시 일관성
CPU에서 데이터를 읽는 동작이 아니라 입력하는 동작이 발생하고 데이터를 변경할 주소가 캐싱된 상태라면 메모리의 데이터가 업데이트되는 대신 캐시의 데이터가 업데이트된다.
따라서 메인 메모리를 업데이트해주어야 하는데 이 메인 메모리를 업데이트 하는 시점에 따라 정책이 두 가지로 나뉜다.
- Write Through 정책 메인 메모리를 바로 업데이트 단순하고 캐시와 메인 메모리의 일관성을 유지할 수 있지만 매번 바꿔줘야 되므로 느리다는 단점 존재 (병렬로 안됨?)
- Write Back 정책 캐시만 업데이트하다가 업데이트 된 데이터가 캐시에서 빠지게 될 때 메인 메모리를 업데이트한다. 속도가 빠르지만 캐시와 메모리의 값이 서로 다른 경우가 발생할 수 있다. dirty bit = modify bit
서버 사이드 캐싱과 클라이언트 사이드 캐싱
서버 사이드 캐싱
- 데이터 베이스 캐싱
- API 캐싱(클라이언트??)
- CDN CDN(Content Delivery Network)는 데이터를 최종 사용자에게 더 가까이에서 데이터를 제공하기 위해 캐시 서버를 사용하는 것 캐싱은 주로 아래와 같은 정적 자료(static assets)들을 불러오는데 사용된다.
-
이미지 파일
-
CSS 파일
-
HTML 파일
-
자바스크립트 파일
캐싱 프록시(Caching Proxy) 정적 파일을 저장해두고 이 파일들을 찾는 요청에 응답하는 서버의 공통된 요청을 가로채서 빠르게 응답
-
프록시 서버는 캐시를 얼마나 유지할까?
캐싱 프록시는 캐시 적중률(cache hit ratio, 캐싱 서버가 전달할 수 있는 컨텐츠의 비율)이라는 개념을 통해 얼마나 성공적으로 캐시들이 전달되는지 측정한다.
CDN 은 전 세계에 위치한 프록시 서버(위에서 이야기한 캐싱 프록시)의 묶음을 말한다.
클라이언트 사이드 캐싱
- HTTP 헤더를 통한 브라우저 캐싱 모든 브라우저는 HTML 페이지 자바스크립트 파일 및 이미지와 같은 웹 문서의 임시 저장을 위해 HTTP 캐시(웹 캐시)의 구현을 제공하고 있다. 이는 서버 응답이 올바른 HTTP 헤더 지시자를 제공하여 브라우저가 응답을 캐싱할 수 있는 시기와 지속 기간을 지시할 때 사용된다 장점
- 리소스가 로컬 캐시로부터 빠르게 로드되기 때문에 사용자 경험이 향상된다. 요청이 네트워크를 통해 전송되지 않기 때문에 왕복 시간(RTT, Round Trip Time)이 발생하지 않는다
- 애플리케이션 서버 및 파이프라인의 다른 구성 요소에 대한 부하가 줄어든다
- 불필요한 대역폭에 대한 지불 비용이 줄어든다
- 캐시 컨트롤
https://developer.mozilla.org/ko/docs/Web/HTTP/Headers/Cache-Control
캐시 주기 설정하기
12월 1일 이후에 생산된 컨텐츠에 문제가 생겨, 회수를 해야 한다고 가정해볼 때
- 생성일자가 12월 1일 이후에 제작된 모든 컨텐츠를 클라이언트에서 실행 시, 서버에서 다시 받아오도록 강제하기 (Last-Modified 방식)
- 12월 1일에 생성된 컨텐츠의 고유 ID를 확인하여, 클라이언트에서 실행 시, 서버에서 다시 받아오도록 강제하기 (ETag 방식)
- 컨텐츠의 유효시간이 3일로 설정되어 있어 3일이 지나면 자동으로 클라이언트에서 서버에 다시 받아오도록 강제하기 (Expires 방식)
- 컨텐츠의 유효 기간이 12월 4일로 설정되어 있어 유효기간이 지나면 서버에 요청해서 다시 받아오도록 강제 하기 (Max-Age 방식)