CodeIgniter User Guide Version 2.1.0


쿼리 캐시 Database Caching Class

데이터베이스 캐싱 클래스는 쿼리를 텍스트파일로 캐싱하도록 하여 데이터베이스의 부하(load)를 줄일수 있도록 합니다.

중요:  캐싱이 활성화 되어있다면 이 클래스는 데이터베이스 드라이버에 의해 자동으로 초기화 됩니다. 절대 이클래스를 직접 로드 하지 마세요.

부가사항:  모든 쿼리 결과 함수가 캐싱가능한 것은 아닙니다. 이 페이지를 주의 깊게 보셔야 합니다.

캐시 활성화 Enabling Caching

캐시는 아래와 같이 3단계를 통해서 활성화 할수 있습니다:

일단 활성화 되면, 데이터베이스 쿼리가 포함된 페이지가 로드될때마다 자동으로 캐싱이 이루어집니다.

캐시는 어떻게 작동하는가 (How Does Caching Work)?

캐시는 페이지가 보여질때마다 동적으로 작동합니다. 캐시가 활성화 되었을때, 웹페이지가 맨처음 로드되면, 쿼리결과 객체는 직렬화(serialize) 되어 서버에 텍스트 파일로 저장됩니다. 두번째로 페이지가 로드 되면 데이터베이스로 접근하는대신에 캐시파일이 사용됩니다. 이미 캐시된 페이지에 대해서는 데이터베이스 사용률이 제로에 가까울정도로 줄어듭니다.

오직 읽어오는 (SELECT) 쿼리만이 캐시될수 있습니다. 왜냐하면 읽어오는쿼리만 결과셋을 생성하기 때문이죠 .쓰는형식 (INSERT, UPDATE, etc.) 는 결과셋을 생성하지 않기 때문에 캐시되지 않습니다.

캐시파일은 종료기간이 없습니다.(스스로 제거되지않습니다). 여러분이 직접 제거하기전까지는 캐시된 채로 남아있습니다. 캐시시스템은 각페이지에 관련된 캐시파일을 지우거나 전체 캐시파일을 지울수 있도록 해줍니다. 일반적으로 , 데이터베이스에 새로운 정보를 삽입한다든지하는 특정 이벤트 발생시 관리함수가 캐시를 지우도록 하고싶으실 겁니다.이에대해서는 아래에 설명합니다.

캐시가 사이트의 성능을 올려줄것인가(Will Caching Improve Your Site's Performance)?

캐시를통한 성능이득을 얻는것은 여러요소에 의해 좌우됩니다. 여러분이 굉장히 최적화가 잘되어있으며 부하가 매우적은 데이터베이스를 사용하신다면 성능향상은 미미할것입니다. 만약 부하가 매우 높은 데이터베이스를 사용한다면, 파일시스템의 부하가 너무높지않다고 가정할때 응답성능이 향상되는것을 느끼실수 있을것 입니다. 반드시 기억해야할것은 , 캐싱은 단순히 정보의 소스를 데이터베이스에서 파일시스템으로 바꾸어준다는것입니다.

에를들어 어떤 클러스터 서버 환경에서는 파일시스템이 혹사당하기 때문에 캐싱은 오히려 해로울수도 있습니다. 공용으로 사용하는 단일 서버환경에서는 ,캐싱이 효과적일것입니다.불행하게도, 데이터베이스를 캐시해야하는지 말아야하는지에 대해 간단히 말할수 없군요 . 그건 여러분의 상황에 달린것이니까요.

캐시파일은 어떻게 저장되는가 (How are Cache Files Stored)?

CodeIgniter는 쿼리의 결과를 각각의 고유한 캐시파일에 저장합니다.캐시파일의 묶음은 여러분의 컨트롤러 함수에 대응하여 나중에 하위폴더로 구성됩니다. 정확하게 말하면, 하위폴더의 이름은 URI 의 첫 두 세그먼트의와 동일합니다(하나는 컨트롤러 클래스의 이름 다른하나는 함수의 이름이 되겠지요).

예를들어 , 컨트롤러 클래스의 이름이 blog 이며 3개의 쿼리가 포함된 comments 함수를 호출한다고 합시다. 캐싱시스템은blog+comments라는 이름의 하위폴더를 생성하고 3개의 캐시파일을 그안에 생성합니다.

만약 페이지번호 등 URI를 통해 전달되는 정보와 결합하여 동적으로 쿼리를 생성하는경우라면 , 각 쿼리별로 고유한 캐시파일이 생성됩니다. 쿼리대신에 캐시파일을 더 많이 사용하는것이 손해일 경우도 있습니다.

캐시파일의 관리 (Managing your Cache Files)

캐시파일이 자동으로 삭제되지 않기 때문에 , 프로그램 내에서 삭제하는 루틴을 만들 필요가 있습니다. 예를들어 , 여러분이 사용자가 글을 쓸수 있는 블로그를 운영한다고 합시다. 새로운 글이 등록될 때마다 , 캐시파일을 지우고싶으실 거예요 . 아래에 설명하는 두가지 삭제함수가 데이터를 지우는데 도움이 될거예요.

어떤 함수들은 캐시시스템에서 작동하지 않음( Not All Database Functions Work with Caching)

마지막으로, 캐시된 결과객체는 실재 객체의 단순버전이라는것을 말씀드립니다. 그 이유로, 몇몇 쿼리결과함수는 사용할수 없습니다.

아래함수들은 캐시된 결과객체에서는 작동하지 않습니다:

또한, 두개의 데이터베이스 리소스(result_id ,conn_id) 는 사용할수 없습니다. 왜냐하면, 그 리소스들은 런타임 작동(run-time operation)의 부산물이기 때문입니다.


함수 레퍼런스 Function Reference

$this->db->cache_on()  /   $this->db->cache_off()

수동으로 캐시를 활성/비활성화 합니다. 이함수들은 캐시로부터 특정 쿼리를 배제하고싶을때 유용합니다(특정쿼리를 캐시하지 않고자할때).

예제:

// Turn caching on
$this->db->cache_on();
$query = $this->db->query("SELECT * FROM mytable");

// Turn caching off for this one query
$this->db->cache_off();
$query = $this->db->query("SELECT * FROM members WHERE member_id = '$current_user'");

// Turn caching back on
$this->db->cache_on();
$query = $this->db->query("SELECT * FROM another_table");

$this->db->cache_delete()

특정페이지에 관련된 캐시파일을 지웁니다.이함수는 데이터베이스 업데이트후 캐시파일을 지우고자할때 유용합니다.

캐싱 시스템은 여러분이 보고있는 페이지의 URI에 대응되도록 캐시파일을 저장합니다. 예를들어example.com/index.php/blog/comments, 페이지를 보고있다면 캐싱시스템은 캐시파일을 blog+comments폴더에 저장합니다. 이 특정 캐시파일을 지우려면 아래와같이 합니다:

$this->db->cache_delete('blog', 'comments');

파라미터로 아무것도 주어지지않는다면, 함수는 현재 URI 를 참조하여 대응되는 캐시파일을 지웁니다.

$this->db->cache_delete_all()

현재 존재하는 모든 캐시파일을 지웁니다. 사용예:

$this->db->cache_delete_all();