Управляемый кеш в Битрикс: как теги сбрасывают кеш точечно
Кеш на час отдаёт старые цены, кеш на минуту грузит базу. Управляемый кеш Битрикса с тегами снимает дилемму: данные живут долго и сбрасываются ровно в момент изменения.

Менеджер поменял цену в инфоблоке, а на сайте ещё час висит старая: компонент закеширован на 3600 секунд. Сократите время жизни кеша до минуты, и база получит ту самую нагрузку, ради снятия которой кеш и включали. Управляемый кеш с тегами убирает дилемму: кеш живёт сутки, а сбрасывается в момент, когда изменились данные, от которых он зависит.
Код рассчитан на Bitrix Framework с ядром D7 (линейка main 20.x и новее). Сигнатуры методов сверяйте с документацией своей версии. Типы хранилищ кеша (файлы, Memcached, Redis) здесь не разбираем, это отдельная тема.
Что такое тег и зачем он кешу
Тег — строковая метка, которую вы привязываете к кешу при его создании. Когда данные меняются, вызывается сброс по метке, и все кеши с этим тегом удаляются разом. Ядро регистрирует собственные теги: например, iblock_id_N привязывает кеш к инфоблоку с номером N, и метка сбрасывается при изменении его элементов.
Пояснение: «управляемый кеш» — режим, в котором ядро хранит связи «тег — кеш» и умеет сбрасывать кеш по тегу. Для компонентов он включается константой BX_COMP_MANAGED_CACHE. Если режим выключен, рассчитывайте, что кеш доживёт до конца TTL.
Четыре способа держать кеш свежим
Только время жизни
Задали TTL и ждёте. Цена: выбор между устаревшими данными и нагрузкой на базу. Подходит там, где устаревание безвредно, например для блока с анонсами.
Тег инфоблока в компоненте
В стандартных компонентах это параметры: CACHE_TYPE со значением A (в интерфейсе «Авто + Управляемое») и CACHE_TIME. В собственном компоненте тег регистрируется вручную. По документации, startResultCache() сам открывает тегированный кеш для пути компонента, поэтому внутри блока достаточно RegisterTag. Проверьте это на своей версии.
<?php
// Фрагмент class.php собственного компонента, ядро D7
public function executeComponent()
{
if ($this->startResultCache(false, [$this->arParams['SECTION_ID']])) {
$this->arResult['ITEMS'] = $this->loadItems(); // схематично: ваша выборка
if (defined('BX_COMP_MANAGED_CACHE')) {
global $CACHE_MANAGER;
$CACHE_MANAGER->RegisterTag('iblock_id_' . (int)$this->arParams['IBLOCK_ID']);
}
$this->includeComponentTemplate();
}
}
Цена: тег инфоблока срабатывает на любую правку в нём. Если остатки обновляются каждую минуту, кеш всех списков этого инфоблока тоже сбрасывается каждую минуту.
Свои теги через D7
Когда данные лежат в собственной таблице или собираются из нескольких источников, заводите свои теги: по одному на источник.
<?php
use Bitrix\Main\Application;
use Bitrix\Main\Data\Cache;
function getPriceList(int $iblockId, int $sectionId): array
{
$cache = Cache::createInstance();
$taggedCache = Application::getInstance()->getTaggedCache();
$ttl = 86400; // живём долго: свежесть обеспечивают теги
$cacheId = 'price_list_' . $sectionId;
$cacheDir = '/myshop/price_list';
if ($cache->initCache($ttl, $cacheId, $cacheDir)) {
return $cache->getVars();
}
$result = [];
if ($cache->startDataCache()) {
$taggedCache->startTagCache($cacheDir);
$result = loadPricesFromDb($iblockId, $sectionId); // схематично: ваш запрос
$taggedCache->registerTag('iblock_id_' . $iblockId);
$taggedCache->registerTag('myshop_prices');
if ($result === []) {
// пустой результат не кешируем
$taggedCache->abortTagCache();
$cache->abortDataCache();
} else {
$taggedCache->endTagCache();
$cache->endDataCache($result);
}
}
return $result;
}
Сброс делается в каждом месте, где вы пишете в свою таблицу:
<?php
use Bitrix\Main\Application;
Application::getInstance()->getTaggedCache()->clearByTag('myshop_prices');
Ручной сброс по ключу или директории
Это уже не управляемый кеш, а ручная чистка: вы знаете ключ или каталог и удаляете их сами.
<?php
use Bitrix\Main\Data\Cache;
$cache = Cache::createInstance();
$cache->clean('price_list_15', '/myshop/price_list'); // один кеш
$cache->cleanDir('/myshop/price_list'); // вся ветка
Сравнение подходов
| Подход | Что выигрываете | Чем платите | Свежесть |
|---|---|---|---|
| Только TTL | Ноль кода | Устаревшие данные или нагрузка на базу | До конца TTL |
| Тег инфоблока | Автосброс при правке элементов | Сброс всех списков инфоблока при любой правке | Сразу |
| Свои теги | Точечный сброс по источнику | Вызов clearByTag во всех местах записи | Сразу, если ничего не забыто |
| Сброс по ключу | Точность | Нужно знать ключ и вызывать вручную | Сразу, если ничего не забыто |
Тег кеша — это договор: каждое место, которое пишет данные, обязано сбросить метку. Забытое место не падает с ошибкой, оно тихо показывает вчерашнюю цену.
Когда что выбирать
Критерий один: есть ли у данных событие изменения, которое вы можете перехватить.
- Данные из одного инфоблока, правки идут через админку или обмен: тег
iblock_id_N. - Данные из своих таблиц или из нескольких источников: свои теги, по одному на источник.
- Данные из внешнего API без уведомлений об изменении: TTL, равный допустимому устареванию.
- Один известный кеш и одно место записи: сброс по ключу.
Что ломается
- Тег зарегистрирован вне пары
startTagCache/endTagCache. Привязки нет, кеш не сбросится. - Путь в
startTagCacheотличается от каталога вinitCache. Держите один путь в переменной, как в примере выше. - Закеширован пустой результат. Вызывайте
abortTagCacheиabortDataCache, иначе пустая страница проживёт весь TTL. - Новое место записи без
clearByTag: чаще всего это импорт или скрипт обмена. - Массовый импорт сбрасывает тег на каждой записи, и кеш пересобирается прямо во время загрузки. Сбрасывайте один раз в конце.
- Тег на каждый товар. Связи тегов хранятся в базе (для файлового кеша это таблица
b_cache_tag), и десятки тысяч уникальных меток раздувают её без пользы.
Что делать дальше
На тестовой копии сохраните элемент в инфоблоке и убедитесь, что страница показывает новое значение без ручной очистки кеша. Затем сравните число SQL-запросов на горячих страницах до и после включения тегов, например в панели производительности Битрикса. Если тег инфоблока сбрасывает слишком много, переходите на свои теги по источникам. Как сбрасывать кеш при больших обменах с 1С, тема отдельного разбора.
Инфобез и 152-ФЗ: Аудит политик конфиденциальности, правила сбора cookie.
Спросить за 20 ₽Источники: Документация разработчика 1С-Битрикс (раздел по кешированию и D7), Курс «Разработчик Bitrix Framework», главы о кешировании и управляемом кеше
Частые вопросы
Что будет, если управляемый кеш выключен?
Тег зарегистрирован, но кеш не сбрасывается. Что проверить?
Чем getTaggedCache() отличается от $CACHE_MANAGER?
Работают ли теги с Memcached и Redis?
Что с продом, если на сайте идут частые обмены данными?
Сколько тегов регистрировать на один кеш?
Материал носит информационный характер и подготовлен редакцией «Агентуры». Он не является офертой, рекламой или индивидуальной консультацией. Упомянутые продукты, компании и торговые знаки принадлежат их правообладателям. Перед принятием решений, влекущих юридические или финансовые последствия, обратитесь к профильному специалисту.