# Кеш запросов ← [Назад к разделу БД](README.md) Фасад `DB` умеет кешировать результаты выборок. Настройки задаются **перед** запросом и действуют на **следующий** `query()` (после выполнения сбрасываются). Реализация — `App\Common\Db\Core\QueryCache`. --- ## Как это работает При выставленном TTL результат `getAll()` сохраняется в кеш по ключу запроса; при повторном таком же запросе данные берутся из кеша, без обращения к БД (см. `queryHelper` → `QueryCache::get/save`). ```php 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`, возвращают инстанс — можно чейнить: ```php DB::setTtl(600)->setTags(array('products')); $rows = DB::query('SELECT * FROM ' . $t . ' WHERE rubric_id = %i', 5)->getAll(); ``` --- ## Инвалидация по тегам Помечайте кеш тегами и сбрасывайте их при изменении данных: ```php // чтение — с тегом 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`.