Files
ave-cms/help/database/cache.md
T
2026-07-27 12:58:44 +03:00

2.9 KiB

Кеш запросов

Назад к разделу БД

Фасад DB умеет кешировать результаты выборок. Настройки задаются перед запросом и действуют на следующий query() (после выполнения сбрасываются). Реализация — App\Common\Db\Core\QueryCache.


Как это работает

При выставленном TTL результат getAll() сохраняется в кеш по ключу запроса; при повторном таком же запросе данные берутся из кеша, без обращения к БД (см. queryHelperQueryCache::get/save).

DB::setTtl(300);   // кешировать следующий запрос на 300 секунд
$rows = DB::query('SELECT * FROM ' . $t . ' WHERE rubric_id = %i', 5)->getAll();
// повторный такой же запрос в течение 5 минут вернётся из кеша

Методы

Метод Назначение
setTtl($ttl = 0) TTL кеша для следующего запроса (сек). 0 — не кешировать.
setCache($cache_id = '', $extension = '') Явный идентификатор/формат записи кеша.
setTags($tags) Пометить кеш тегами (для групповой инвалидации).
clearTags($tags) Сбросить кеш по тегам.

Все, кроме clearTags, возвращают инстанс — можно чейнить:

DB::setTtl(600)->setTags(array('products'));
$rows = DB::query('SELECT * FROM ' . $t . ' WHERE rubric_id = %i', 5)->getAll();

Инвалидация по тегам

Помечайте кеш тегами и сбрасывайте их при изменении данных:

// чтение — с тегом
DB::setTtl(600)->setTags(array('products'));
$list = DB::query('SELECT * FROM ' . $products . ' WHERE active = 1')->getAll();

// запись — сбрасываем тег
DB::Insert($products, $newProduct);
DB::clearTags(array('products'));   // связанные кеши устареют

Рекомендации

  • Кешируйте тяжёлые/частые выборки (списки, агрегаты, справочники), а не всё подряд.
  • Всегда навешивайте теги и сбрасывайте их в местах записи — иначе получите устаревшие данные.
  • TTL — «страховка» на случай, если тег забыли сбросить; ставьте разумный (минуты).
  • Эталон продуманной инвалидации в проекте — DocumentRenderCache / ContentCacheInvalidator.