Управляемый кэш в Битрикс: теги, автосброс и работа с тегами инфоблоков

Управляемый кэш (managed cache) в Битрикс — это кэш с тегами, который позволяет сбрасывать только нужные данные при изменении контента. Без него приходится либо не кэшировать вообще, либо сбрасывать всё подряд.

Как работает управляемый кэш

Обычный кэш хранит данные по ключу и живёт заданное время. Управляемый кэш добавляет теги — метки, по которым можно сбросить группу записей.

Битрикс автоматически тегирует кэш компонентов: при изменении элемента инфоблока сбрасывается кэш всех компонентов, связанных с этим инфоблоком.

Сохранение данных с тегами

$cache   = \Bitrix\Main\Application::getInstance()->getCache();
$tagCache = \Bitrix\Main\Application::getInstance()->getTaggedCache();

$cacheId  = 'product_list_' . $categoryId;
$cacheDir = '/product/list/';
$ttl      = 3600; // 1 час

if ($cache->initCache($ttl, $cacheId, $cacheDir)) {
    // Данные из кэша
    $data = $cache->getVars();
} elseif ($cache->startDataCache()) {
    // Загружаем из базы
    $data = fetchProductsFromDb($categoryId);

    // Регистрируем теги
    $tagCache->startTagCache($cacheDir);
    $tagCache->registerTag('iblock_id_5');  // инфоблок 5
    $tagCache->endTagCache();

    $cache->endDataCache($data);
}

Ручной сброс кэша по тегу

// Сбросить всё что связано с инфоблоком 5
\Bitrix\Main\Application::getInstance()
    ->getTaggedCache()
    ->clearByTag('iblock_id_5');

// Сбросить конкретный элемент
\Bitrix\Main\Application::getInstance()
    ->getTaggedCache()
    ->clearByTag('iblock_element_id_123');

Стандартные теги инфоблоков

Битрикс автоматически регистрирует эти теги при изменении данных:

Тег Когда сбрасывается
iblock_id_N Любое изменение в инфоблоке N
iblock_element_id_N Изменение элемента N
iblock_section_id_N Изменение раздела N
USER_GROUPS Изменение групп пользователей

Кэш в компонентах

В шаблоне компонента используйте стандартный механизм:

// component.php
if ($this->startResultCache($ttl, $additionalCacheId)) {
    // Выборка данных
    $this->arResult['ITEMS'] = fetchItems();
    
    // Регистрируем тег
    $this->setResultCacheKeys(['ITEMS']);
    
    // Добавляем тег инфоблока
    $tagCache = \Bitrix\Main\Application::getInstance()->getTaggedCache();
    $tagCache->registerTag('iblock_id_' . $iblockId);
    
    $this->endResultCache();
}

Где хранится кэш

По умолчанию в файловой системе: /bitrix/cache/. Для production настоятельно рекомендуется Redis:

// /bitrix/.settings.php
'cache' => [
    'value' => [
        'type' => 'memcache', // или redis
        'memcache' => [
            'host' => '127.0.0.1',
            'port' => 11211,
        ],
    ],
],

Диагностика: кэш не сбрасывается

  1. Проверьте что тег совпадает при записи и при сбросе
  2. Убедитесь что tagCache->startTagCache() и endTagCache() вызываются в паре
  3. Проверьте директорию кэша — она должна совпадать
  4. Временно добавьте $cache->cleanDir($cacheDir) для принудительной очистки

Итог

Управляемый кэш — обязательный инструмент для любого нагруженного Битрикс-проекта. Правило простое: всегда регистрируйте теги инфоблоков при кэшировании данных из них — тогда сброс будет происходить автоматически при редактировании контента.