db_query () 결과를 어떻게 캐시합니까?


9

내가 사용 views_get_view_result()하면 해당 시간에 편리했기 때문에 뷰에서 결과를 얻을 수 있습니다. 쿼리 결과는 거의 변경되지 않습니다. 6 일 동안 뷰 캐싱을 사용할 수 있습니다.

db_query()캐싱을 활성화하는 방법 에 대한 호출로 변환하려면 어떻게해야합니까?

답변:


9

views 또는 db_query ()를 사용하면 캐싱이 중요하지 않습니다. 캐싱은 항상 동일하게 작동하며, 캐시 미스가 완전 할 때 데이터를 가져 오는 방법에 달려 있습니다.

  1. 캐시 항목을 식별하기 위해 캐시 ID를 빌드하십시오. 단순하고 하드 코딩 된 문자열이거나 인수 등을 기반으로하는 복잡한 문자열 일 수 있습니다.
  2. 캐시에서로드 할 수 있는지 확인하십시오.
  3. 그렇지 않은 경우 데이터를 다시 빌드하고 원하는 만료 시간으로 캐시에 넣습니다.

몇 가지 예를 보려면 cache_get ()을 사용 하는 함수 ( 예 : variable_initialize ())를 볼 수 있습니다.

함수가 여러 번 호출 된 경우이를 정적 캐시와 결합하려고 할 수 있습니다 ( 예 : archiver_get_info () 참조 ) . 그리고 데이터 재구성이 실제로 느린 경우 variable_initialize ()와 같이 잠금 프레임 워크를 사용하여 여러 번 발생하는 것을 방지 할 수 있습니다.

cache_get ()도 Memcache와 같은 대체 캐시 백엔드를 사용하지 않는 한 db 쿼리이기 때문에 단일 쿼리 캐싱은 느린 쿼리 인 경우에만 의미가 있습니다.

마지막으로 Views에는 캐싱이 이미 내장되어 있으며보기에서 구성 할 수 있습니다. 옵션이기도합니다.


나에게 이길;) 나는 코드 예제로 내 대답을 남겨 두 겠지만 이것은 더 유용한 정보입니다
Clive

PDO 인스턴스를 직렬화 할 수 없다고 생각 했습니까?
mpdonadio

1
아니요, 관련이 없지만 관련이 없습니다. pdo 결과 리소스를 캐시하지 않고 해당 쿼리에서 실제로 가져온 데이터 구조를 캐시합니다.
Berdir

나는 그것이 매우 관련이 있다고 말할 것입니다. @MotoTribe이 결과를 캐싱에 대해 질문했다 db_query(),과에서 값을 캐시 할 필요 $results->fetchAll()가 아닌 것은 $results실제로 작업에 얻는 열쇠입니다.
mpdonadio

7

DB 레이어에는 캐싱 메커니즘이 내장되어 있다고 생각하지 않지만 (잘못되었을 수도 있지만) 기본 캐시 API를 사용할 수 있습니다.

다음은 특정 유형의 노드를 얻기 위해 쿼리 결과를 캐시하는 기본 예제입니다.

function MYMODULE_get_nodes_by_type($type) {
  // Setup a cache ID
  $cid = 'MYMODULE:node_types:' . $type;

  // If a cached entry exists, return it
  if ($cached = cache_get($cid)) {
    return $cached->data;
  }

  // Otherwise load the data
  $data = db_query('SELECT * FROM {node} WHERE type = :type', array(':type' => $type))->fetchAll();

  // And cache it
  cache_set($cid, $data, 'cache', strtotime('+6 days'));
}

3

Drupal이 제공 하는 표준 cache_set / cache_get 메커니즘 외에도 MySQL을 데이터베이스로 사용하는 경우 뷰 또는 다른 데이터베이스 쿼리의 결과를 투명하게 캐시 할 수있는 쿼리 캐시를 활성화 할 수 있습니다 . mysqltuner 는 캐시 크기에 대한 좋은 값을 찾는 데 도움을 수 있습니다.

데이터베이스에 많은 양의 쓰기 작업을 수행하는 경우 캐시 무효화 전략의 작동 방식으로 인해 쿼리 캐싱의 효율성이 떨어집니다 (테이블에 쓰면 SELECT FROM 또는 해당 테이블에 참여하는 모든 항목이 무효화 됨).

PostgreSQL대한 캐싱 메커니즘 도 있지만 직접 경험이 없습니다.


3

최근에 캐시 작업 모듈을 발견했습니다 . 이 모듈을 사용하면보기 캐싱을 규칙 트리거 캐시로 설정하고 특정보기 및보기 표시에서 캐시를 무효화하는 규칙을 작성할 수 있습니다.

예를 들어, 특정 컨텐츠 유형의 노드를 나열하는보기의 캐시는 해당 컨텐츠 유형의 새 노드가 작성 될 때 비워 질 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.