캐시의 개념
캐시는 장치간의 입출력 속도의 차이를 해결하기 위해서 자주 사용하는 데이터를 미리 복사해두는 임의의 장소
캐시를 이해하기 위한 선수개념
메모리 계층(Memory Hierarchy)
- 컴퓨터에서 메모리의 속도와 용량은 반비례 관계
- 일반적으로 속도가 빠를수록 용량이 작기 때문에 두가지를 모두 잡기 위해서는 비용이 많이 듦
- 위와 같은 이유로 데이터 저장공간은 역할을 나눠서 사용하는게 일반적이고 속도와 용량의 관계에 따라 나열하게 되면 위와 같은 피라미드 형태를 구성하게 된다.
파레토의 법칙(캐시의 철학적 개념)
원인의 상위 20% 가 전체 결과의 80%를 만든다는 법칙
데이터 지역성
자주 쓰이는 데이터는 시간적 혹은 공간적으로 한곳에 몰려있을 가능성이 높다.
캐시 메모리는 데이터 지역성(Locality)의 원리를 사용
-
시간 지역성
한 번 참조된 데이터는 잠시 후에 또 참조될 가능성이 높다는 성질
ex) for문의 i값은 해당 for문이 끝나기 까지 계속 사용할 가능성이 높다.
-
공간 지역성
데이터 배열에 연속으로 접근할 때 참조된 데이터 근처에 있는 데이터가 잠시 후에 사용될 가능성이 높다는 성질
ex) for문에서 배열에 접근한다고 할 때 배열이라는 것이 메모리의 데이터를 나열해놓은 것이기 때문에 그 배열의 메모리공간은 계속 사용할 가능성이 높다.
캐시의 작동방식
- 원본 데이터와는 별개로 자주 쓰이는 데이터를 따로 캐시공간에 복사해둔다 ex) hash자료구조와 유사
- 캐시에 원하는 데이터가 없을 경우는 원본 데이터에 접근하여 가져온다.
- 이 때 데이터를 가져오면서 캐시에도 해당 데이터를 복사하거나 갱신한다.
- 캐시 공간은 작기때문에 안쓰는 데이터는 삭제하여 공간을 확보 ex)LFU(Least Frequently Used), LRU(Least Recently Used) ...)
캐시를 쓰이는 사례
- 하드디스크나 SSD 혹은 아무리 빠른 주기억자치라 할지라도 CPU의 속도를 따라가기엔 어려움 따라서 캐시를 사용한다.
- 구글은 각 통신사 마다 구글 글로벌 캐시를 두어 인기있는 유튜브 동영상을 미국 서버까지 접속할 필요없이 처리하도록 한다.(cdn)
- 네트워크를 통해 데이터를 가져오는 것은 하드디스크보다도 느릴 때가 많기 때문에 웹 브라우저는 html css js 이미지 등을 하드디스크나 메모리에 캐싱해뒀다가 다시 접속할 때 재활용한다.(브라우저 캐시)
브라우저 캐시 : 웹 프로그래머가 통제해야 하는 캐시
- 웹 서버에서 클라이언트에 보내는 http 헤더에 캐시 지시자를 삽입
- 웹 브라우저는 해당 지시자에 명시된 캐시 정책에 따라 캐싱을 실시
- 이 때 캐시의 유효 시간이 지나도 캐시된 데이터가 바뀌지 않는 경우를 확인하기 위해 Etag라는 유효성 검사 토큰을 사용
- 웹서버 또한 상당수의 경우 동적 웹페이지라 할지라도 매번 내용이 바뀌지 않는 경우가 많으므로 서버에서 생성한 html을 캐싱해두었다가 다음요청에 재활용한다.(응답캐시)
- 웹서버 앞단의 프록시 서버에서 캐싱해둔 데이터를 바로 제공하기도 한다.(프록시 캐시)
- Redis
- NoSQL DBMS의 일종으로 웹 서비스에서 캐싱을 위해 사용(해시)
- 기본적으로 모든 데이터를 메모리에 저장하여 처리하기 때문에 속도가 빠름
- DBMS의 일종이기 때문에 메모리에서 데이터가 삭제되지 않음