캐싱
저장한다는 뜻입니다.
컴퓨팅에서는 오랜 시간이 걸리는 작업의 결과를 저장해서 시간과 비용을 회피하는 것입니다.
고성능 애플리케이션을 만드는 데 가장 중요한 요소 중 하나입니다.
사례
•
시험을 볼 때 원리를 이해하고 푸는 게 아니라, 덤프를 외워서 답안을 작성
•
웹브라우저는 한번 다운로드한 이미지 파일은 임시 저장 디렉토리에 저장했다가 다음 요청이 있을 때 사용
•
웹페이지를 탐색할 때 도메인을 이용하면 내부적으로는 그 도메인에 해당하는 IP를 알아내기 위해 네임 서버에 접속하고, 네임 서버가 알려준 IP 주소를 운영체제나 브라우저가 그 결과를 기억하고 있다가 동일 도메인에 대한 접근 시 저장된 IP 주소를 사용
•
CPU는 연산의 결과를 빠르게 저장하기 위해 메인 메모리보다 빠른 캐시 메모리를 사용해서 작업을 처리
예시
heavy_job이 있다. 이 처리를 위해 24시간이 걸린다고 치면 많은 시간과 자원이 필요하다. 그 결과를 저장했다가 동일한 처리를 할 때 그 결과를 사용할 수 있다.
<?php
function heavy_job($input){
sleep(5); // 5초가 걸리는 작업
return $input+1;
}
$cache = array();
$input = 10;
if(empty($cache[$input])){
$cache[$input] = heavy_job($input);
}
echo $cache[$input];
if(empty($cache[$input])){
$cache[$input] = heavy_job($input);
}
echo $cache[$input];
?>
PHP
복사
위의 코드는 캐쉬의 기본적인 메커니즘을 보여준다.
시간이 오래 걸리는 heavy_job이라는 함수를 호출한 후에 그 결과를 $cache 배열에 담고
같은 작업이 실행될 때 $cache에 결과가 저장되어 있는지를 확인한다.
저장되어 있지 않다면 heavy_job을 실행 한 후에 그 결과를 $cache에 담고,
저장되어 있다면 저장된 결과를 그냥 출력한다.
이를 통해서 동일한 연산이 반복되는 것을 피할 수 있다.
난제
연산의 결과가 달라졌을 때 처리입니다.
웹 브라우저 캐쉬를 예로 들어보면, 생활코딩 로고를 임시 저장소에 저장하고, 접속할 때 그 이미지를 사용하는 상황에서 로고가 리뉴얼된다면? 이것이 캐싱의 일반적인 문제인 ‘갱신의 어려움'입니다.
TTL
Time To Live라는 의미로 캐시 생성 시 만료 기간을 정해두는 것입니다.
만료기간이 지나면 삭제하고 다시 생성하는 기법입니다.
캐쉬의 명시적인 삭제
캐쉬가 유효하지 않을 때 캐쉬를 명시적으로 삭제해서 새로운 캐쉬가 만들어지도록 하는 것입니다.
Web Caching
이미지나 JS 파일 등을 웹 브라우저가 캐쉬하도록 하는 것입니다.
이를 위해 웹 서버는 대상이 되는 데이터에 대한 특별한 처리가 필요합니다.
HTTP Reverse Proxy Caching
리버스 캐싱이란 웹 서버에 유입되는 HTTP 트래픽을 캐싱 시스템이 저장하고 있다가 동일 요청이 들어왔을 때 캐싱 시스템이 데이터를 돌려줌으로써 빠른 응답 성능을 제공하는 방법입니다.
웹서버들은 기본적으로 리버스 프록시 기능을 제공한다.
리버스 프록시를 전문적으로 수행하는 솔루션들이 있다. 이런 솔루션들은 웹서버 보다 더 다양하고 높은 성능을 제공하는 것으로 알려져있다.
OPCODE Caching
OPCODE는 기계어의 로우레벨에서 컴퓨터 상에 하달되는 일종의 신호인데, 이 신호를 캐슁하는 기법이다. PHP와 같은 인터프리터 언어의 성능상의 단점을 비약적으로 향상시켜준다. 이름과는 다르게 설치해서 사용하기 매우 쉽다. 아래는 OPCODE Caching을 지원하는 PHP 가속기들의 리스트. 필자는 APC를 추천한다.
Web Page Caching
우리가 배울 내용이다.
Page Caching은 페이지 전체를 캐슁하는 방법인데,
CodeIgniter는 Page Caching 기능을 제공해서
동일 요청 페이지에 대한 캐슁을 생성해서
빠른 속도로 페이지를 제공할 수 있다.
CodeIgniter에서 웹페이지 아래의 코드를 컨트롤러에 추가하면 된다. 아래 코드가 실행되면 /application/cache/ 디렉토리에 캐쉬가 만들어진다. 한번 캐쉬가 만들어지만 이후 동일한 URL로 진입하는 요청은 캐쉬 파일의 내용을 읽어서 사용하게 되고 처리가 종료되기 때문에 성능 향상에 도움이 된다.
인자 n은 캐쉬를 유지할 시간(TTL)으로 단위는 분이다. 자세한 내용은 메뉴얼을 참고하자.
$this->output->cache(n);
PHP
복사
캐쉬의 저장소
캐쉬 데이터를 어디에 저장할 것인가의 문제는 어떤 방식의 캐쉬를 사용할 것인가 만큼 중요한 문제다. 다음은 캐쉬를 저장하는 주요 저장소이다.
파일
캐슁을 저장할 때 가장 기본적으로 고려되는 저장소다. 장점은 저렴하다는 점이다. 단점은 캐쉬 데이터를 여러 시스템에서 공유하기가 어렵다는 점과 메모리 대비 느리다는 점을 들 수 있다. 또한 캐쉬 메커니즘을 직접 구현해야 하는 어려움이 있다.
메모리
대용량의 메모리를 지원하는 하드웨어가 늘어나면서 메모리를 캐쉬 저장소로 이용하는 사례가 많아지고 있다. 특히 Memcached와 같은 솔루션을 이용하면 캐쉬의 생성, 소멸을 솔루션에게 위임할 수 있고, 또 네트워크를 통해서 접근 하는 기능을 지원하기 때문에 단일 캐쉬에 대해서 여러 머신에서 엑세스 할 수 있다는 장점이 있다. 무엇보다도 큰 장점은 파일 보다 훨씬 빠르게 데이터를 처리 할 수 있다는 점이다. 단점은 비싸다.
데이터베이스
데이터베이스도 데이터를 캐쉬하기에 좋은 공간이다. 자체적인 보안 시스템을 갖추고 있고, 네트웍을 통해서 접근 할 수 있기 때문에 캐슁 데이터를 공유할 수 있는 장점도 있다. 메모리 보다 느린 것이 단점이다.