Database Caching Class

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

Important

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

Important

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

캐시 활성화 Enabling Caching

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

  • 캐시 파일이 저장될 디렉토리를 만들고, 쓰기 가능하도록 합니다.
  • 캐시 디렉토리의 경로를 application/config/database.php 파일 안에 설정합니다.
  • 캐시를 활성화합니다. application/config/database.php 파일을 통해 전역적으로 활성화 하거나, 아래 기술된 방법을 통해 수동으로 활성화 합니다.

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

캐시는 어떻게 작동하는가 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

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

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

  • num_fields()
  • field_names()
  • field_data()
  • free_result()

또한, 두 개의 데이터베이스 리소스(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();