mirror of
https://github.com/avecms/AVE.cms.git
synced 2026-08-01 08:45:44 +00:00
2.9 KiB
2.9 KiB
Кеш запросов
Фасад DB умеет кешировать результаты выборок. Настройки задаются перед
запросом и действуют на следующий query() (после выполнения сбрасываются).
Реализация — App\Common\Db\Core\QueryCache.
Как это работает
При выставленном TTL результат getAll() сохраняется в кеш по ключу запроса; при
повторном таком же запросе данные берутся из кеша, без обращения к БД (см.
queryHelper → QueryCache::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.