Як кешувати результат db_query ()?


9

Раніше я views_get_view_result()отримував результати, оскільки це було зручно в той час. Результат запиту рідко змінюється; Я можу використовувати кешування переглядів 6 днів.

Якщо я хотів перетворити його на виклик, db_query()як я можу включити кешування?

Відповіді:


9

Не має значення для кешування, якщо ви використовуєте представлення або db_query (). Кешування працює завжди однаково, як саме ви отримуєте дані, коли кеш не вистачає.

  1. Створіть ідентифікатор кешу, щоб ідентифікувати ваш запис у кеші. Це може бути проста, жорстко закодована рядок або щось складне на основі аргументів тощо.
  2. Перевірте, чи можна завантажити з кеша.
  3. Якщо ні, відновіть дані та покладіть їх у кеш із потрібним часом закінчення.

Щоб переглянути деякі приклади, ви можете переглянути функції, які використовують cache_get () , наприклад, змінний_initialize () .

Якщо ваша функція викликається кілька разів, ви, ймовірно, хочете поєднати її зі статичним кешем, див., Наприклад, archiver_get_info () . І якщо відновлення даних відбувається дуже повільно, ви можете запобігти його повторному виконанню, використовуючи блокуючий фреймворк, як це робиться varia_initialize ().

Зауважте, що кешування одного запиту має сенс лише у випадку повільного, оскільки cache_get () також є db-запитом, якщо ви не використовуєте альтернативний кешбек, такий як Memcache.

І нарешті, Views має кешування вже вбудованим і може бути налаштовано у вашому представленні. Тож це може бути і варіантом.


Побийте мене;) Я залишу свою відповідь як приклад коду, але це корисніша інформація
Clive

Я думав, що випадки PDO не піддаються серіалізації?
mpdonadio

1
Ні, їх немає, але це не актуально. Ви не кешуєте ресурс результату pdo, ви кешуєте будь-які структури даних, які ви насправді отримуєте з цього запиту.
Бердір

Я б сказав, що це дуже актуально. @MotoTribe запитував про результати кешування db_query(), а також необхідність кешувати значення, $results->fetchAll()а не $resultsє ключовим фактором для того, щоб насправді змусити його працювати.
mpdonadio

7

Я не думаю, що у шару БД немає вбудованого механізму кешування (хоча я можу помилятися), але ви можете використовувати 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

На додаток до стандартного механізму cache_set / cache_get, який надає Drupal, якщо ви використовуєте MySQL як свою базу даних, ви можете включити кеш запитів , який може кешувати результати переглядів або будь-які інші запити бази даних, прозоро. mysqltuner може допомогти у визначенні хороших значень розміру кешу.

Просто зауважте, що якщо ви багато пишете в базу даних, то кешування запитів стає менш ефективним через те, як працює стратегія відключення кешу (запис у таблицю приводить до недійсності всі записи, які ВИБІРТЕ ВІД або приєднатися до цієї таблиці).

Існує також механізм кешування для PostgreSQL , але я не маю прямого досвіду роботи з ним.


3

Нещодавно я відкрив модуль кеш-дій . За допомогою цього модуля ви можете встановити кешування подання кешу, керованого правилами, та створити правило для вимкнення кешу на певних екранах перегляду та переглядів.

Наприклад, кеш для подання, який перелічує вузли певного типу вмісту, може бути випорожнений, коли створюється новий вузол цього типу вмісту.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.