-10%Переходите к нам от другого подрядчика — дадим скидку на первый этап работ

Кэш-стратегии для динамичных цен и остатков

Кэш-стратегии для динамичных цен и остатков в каталоге на 1С-Битрикс

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

В этой статье разберём кэш-стратегии для каталога с динамичными ценами и остатками на 1С-Битрикс: композитный сайт, теговый и управляемый кэш, кэш по ключу для B2B-цен, инвалидацию при обмене с 1С и выбор бэкенда. Настройку такой архитектуры мы делаем в рамках аудита и оптимизации 1С и производительности каталога.

Коротко

  • Не кэшируйте страницу целиком: разделите статику (описание, фото) и динамику (цена, остаток, корзина).
  • Композитный сайт отдаёт статику мгновенно, а персональную цену и остаток догружает отдельно.
  • Используйте теговый (управляемый) кэш с инвалидацией по событию, а не кэш по таймеру.
  • Свяжите инвалидацию с обменом CommerceML, чтобы при обновлении товара сбрасывался только его кэш.

Конфликт скорости и актуальности

В основе всей темы лежит один конфликт: кэш ускоряет сайт ровно потому, что отдаёт заранее посчитанный результат, не пересчитывая его каждый раз. Но цена и остаток — это как раз то, что меняется, и «заранее посчитанное» быстро устаревает. Чем агрессивнее кэш, тем выше риск показать неактуальные данные.

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

Что именно меняется часто

Прежде чем выбирать стратегию, надо разложить содержимое карточки и каталога по частоте изменений. Это основа всех дальнейших решений.

ДанныеЧастота измененийСтратегия
Название, описание, фотоРедкоДолгий кэш
Характеристики, категорииРедкоДолгий кэш, теги
Базовая ценаПериодическиТеговый кэш
Персональная цена клиентаЗависит от группыКэш по ключу / динамика
Остаток на складеЧастоКороткий кэш / динамика
Кнопка в корзину, статусКаждый запросВне кэша

Видно главное: большая часть карточки меняется редко и прекрасно кэшируется надолго, а «проблемные» — это цена и остаток. Именно на них и направлены специальные приёмы, а не на страницу целиком.

Персональные рекомендации на основе модели Поведениепросмотры, покупкиМодельэмбеддинги / MLПохожие товарырядом в вектореРекомендациив карточке и корзине
Схема: поведение покупателей превращается в векторы (эмбеддинги), похожие товары оказываются рядом в пространстве — и попадают в блоки рекомендаций.

Разделяй статику и динамику

Фундаментальный принцип — разделение контента по изменчивости. Страница перестаёт быть монолитом и распадается на слои, каждый со своим режимом кэширования.

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

Композитный сайт для каталога

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

Для каталога с меняющимися ценами это идеальный шаблон. Пользователь сразу видит структуру страницы, фото и описание из композитного кэша — время до первого контента минимально. А персональная цена, актуальный остаток и состояние корзины приходят следом динамическим запросом. В результате сайт кажется мгновенным, но не показывает устаревших цен.

Граница композита — ключевое решение. Всё, что зависит от пользователя (его цена, его корзина) и часто меняется (остаток), должно быть в динамической области. Если это попало в статичный композитный кэш, один клиент увидит цену другого.

Композитный сайт — большая отдельная тема: как его настраивать и где подводные камни, мы подробно разбираем в статье про хостинг и инфраструктуру BitrixVM, где композит работает в связке с правильно настроенным окружением.

Теговый и управляемый кэш

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

Теговый кэш устроен иначе. Каждый закэшированный блок помечается тегами — например, идентификатором товара или инфоблока. При изменении товара сбрасываются только кэши с соответствующим тегом, а не по таймеру и не весь каталог. Это точечная инвалидация по событию: данные обновляются ровно тогда, когда реально изменились.

Работа с кэшем и данными в современном Битриксе строится через D7 — как это устроено, мы разбираем в статье про D7 ORM в Битрикс, где теговый кэш встроен в слой доступа к данным.

Кэш по ключу для B2B-цен

Отдельная головная боль — персональные цены. В B2B у каждой группы клиентов своя цена, а иногда цена зависит от договора конкретного контрагента. Кэшировать «одну цену на всех» тут нельзя.

Решений два, и обычно их комбинируют. Первое — кэш по ключу: в ключ кэша включается группа пользователя или тип цены, тогда для каждой группы держится свой закэшированный вариант. Это работает, пока групп немного. Второе — вынос персональной цены в динамическую область (композит или отдельный AJAX-вызов), чтобы не плодить кэш под каждого клиента и гарантированно не показать чужую цену.

Для по-настоящему индивидуальных цен второй подход надёжнее: цену конкретного авторизованного клиента считают на лету в динамике, а кэшируют только то, что общее для группы. Тему цен по группам мы подробнее раскрываем в материалах по B2B-каталогу.

Инвалидация при обмене с 1С

Всё построение кэша держится на одном критичном моменте — корректной инвалидации при обмене с 1С. Именно обмен CommerceML регулярно приносит новые цены и остатки, и после каждого обновления связанный кэш должен сброситься.

Идеальная картина: обмен затрагивает только изменившиеся товары и сбрасывает ровно их теги кэша. Тогда всё остальное остаётся закэшированным, а обновлённые позиции пересчитываются. Проблема начинается, когда обмен помечает «изменённым» весь каталог целиком — тогда кэш сбрасывается полностью при каждой выгрузке и теряет всякий смысл, а сайт постоянно пересчитывает страницы под нагрузкой.

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

Как строить надёжный и частичный обмен, а также безопасно принимать события от внешних систем, мы разбираем в статье про REST, вебхуки и безопасность в Битрикс.

Бэкенды кэша: файлы, Memcached, Redis

Где физически хранится кэш — тоже влияет на скорость и на то, насколько быстро отрабатывает инвалидация. У каждого бэкенда свои сильные стороны.

БэкендПлюсыМинусы
ФайловыйПрост, не требует сервисовМедленная инвалидация, не для кластера
MemcachedБыстрый, in-memory, тегиДанные не переживают перезапуск
RedisБыстрый, гибкий, общий на кластерТребует настройки и памяти

Для небольшого сайта файлового кэша может хватить, но на нагруженном каталоге с частой инвалидацией и несколькими серверами почти всегда выбирают Memcached или Redis: они быстрее и умеют держать общий кэш для всего кластера. Выбор бэкенда — часть общей настройки инфраструктуры под нагрузку.

Остаток как самая изменчивая величина

Остаток — самое сложное для кэша: он меняется от каждой продажи и каждого обмена, и именно на нём чаще всего «врут» плохо настроенные сайты. Для него применяют самые короткие и точечные стратегии.

Показывать точный остаток до штуки на карточке под высокой нагрузкой — почти всегда лишнее: он мгновенно устаревает. Градация надёжнее и для покупателя понятнее.

Проверка наличия при оформлении

Каким бы хорошим ни был кэш, есть момент, где на актуальность полагаться нельзя ни в коем случае — это оформление заказа. Между просмотром карточки и нажатием «Оформить» товар мог закончиться, поэтому финальную доступность проверяют заново.

Практика такая: на витрине допустимо показывать чуть «загрублённый» кэшированный остаток ради скорости, но в момент добавления в корзину и особенно при оформлении наличие проверяется по актуальным данным. Так вы не тормозите каталог ради точности до штуки, но и не продаёте то, чего уже нет. Это разделение ответственности между «быстрой витриной» и «строгим оформлением» — важная часть архитектуры.

Частые ошибки

Чек-лист внедрения

  1. Контент разложен по изменчивости. Ясно, что статично, что полудинамично, что динамично.
  2. Композит настроен. Статика мгновенна, персональная цена и остаток — в динамике.
  3. Теговый кэш включён. Блоки помечены тегами товаров и инфоблоков, инвалидация по событию.
  4. B2B-цены решены. Кэш по ключу группы или вынос персональной цены в динамику.
  5. Обмен частичный. Обновляются только изменённые товары, сбрасываются только их теги.
  6. Бэкенд под нагрузку. Memcached или Redis на нагруженном каталоге и кластере.
  7. Остаток загрублён на витрине. Градация вместо точного числа, короткий кэш.
  8. Проверка при оформлении. Финальная доступность сверяется по актуальным данным.

Вывод

Кэшировать каталог с динамичными ценами и остатками можно и нужно — вопрос лишь в том, чтобы не кэшировать всё одним куском. Разделите контент на статичный, полудинамичный и динамичный слои, отдайте статику мгновенно через композит, а цену и остаток держите на теговом кэше с точечной инвалидацией или выносите в динамику.

Критичная связка — инвалидация при обмене с 1С: обмен должен обновлять только изменённые товары и сбрасывать только их теги, иначе кэш теряет смысл. Добавьте правильный бэкенд под нагрузку и обязательную проверку наличия при оформлении — и вы получите каталог, который одновременно летает и не врёт покупателю о цене и наличии.

Частые вопросы

Можно ли вообще кэшировать страницы, где цены и остатки постоянно меняются?

Да, но не «страницу целиком одним куском». Правильный подход — разделить контент на статичную часть (описание, фото, характеристики), которую можно кэшировать надолго, и динамическую (цена клиента, остаток, кнопка в корзину), которую выносят из кэша или обновляют отдельно. Тогда основная разметка отдаётся мгновенно из кэша, а изменчивые данные подгружаются точечно и всегда актуальны.

Что такое композитный сайт в 1С-Битрикс и зачем он тут?

Композитный сайт — это технология Битрикса, которая разбивает страницу на статичную часть, отдаваемую почти мгновенно (в том числе из кэша браузера и сервера), и динамическую, догружаемую отдельным запросом. Для каталога с меняющимися ценами это идеальный шаблон: статику видит пользователь сразу, а персональная цена и остаток приходят следом. Композит резко улучшает время до первого контента без потери актуальности данных.

Чем теговый кэш лучше кэша по времени для остатков?

Кэш по времени (TTL) обновляется вслепую по таймеру: он либо держит устаревший остаток до истечения срока, либо сбрасывается слишком часто и не даёт выигрыша. Теговый (управляемый) кэш инвалидируется по событию — при изменении конкретного товара сбрасывается только связанный с ним кэш. Это точнее: данные обновляются ровно тогда, когда реально изменились, а не по расписанию.

Как обмен с 1С влияет на кэш каталога?

Обмен CommerceML регулярно обновляет цены и остатки, и после каждого обновления связанный кэш должен корректно инвалидироваться, иначе покупатель увидит старые данные. Идеально, когда обмен затрагивает только изменившиеся товары и сбрасывает лишь их теги кэша, а не весь каталог. Если же обмен помечает «изменённым» всё подряд, кэш постоянно сбрасывается целиком и теряет смысл.

Стоит ли кэшировать персональные цены B2B-клиентов?

Кэшировать персональную цену «на всех» нельзя — разные группы видят разные цены. Но можно кэшировать по ключу, включающему группу или тип цены пользователя: тогда для каждой группы держится свой вариант кэша. А саму цену конкретного авторизованного клиента чаще выносят в динамическую область (composite/AJAX), чтобы не плодить кэш под каждого и не показать чужую цену.

Какой бэкенд использовать для кэша — файлы, Memcached или Redis?

Файловый кэш прост, но медленно инвалидируется и плохо масштабируется на несколько серверов. Для нагруженного каталога с частой инвалидацией лучше подходят Memcached или Redis: они быстрые, поддерживают теговый кэш и общий кэш между серверами кластера. Выбор зависит от нагрузки и архитектуры, но на серьёзном магазине in-memory кэш почти всегда предпочтительнее файлового.

Как не показать покупателю устаревший остаток при высокой посещаемости?

Сочетанием точечной инвалидации и выноса остатка в динамику. Остаток — самая изменчивая величина, поэтому его либо держат в короткоживущем управляемом кэше с инвалидацией по событию продажи и обмена, либо запрашивают отдельным быстрым вызовом при загрузке карточки. А финальную доступность всегда проверяют в момент оформления заказа, чтобы не продать то, чего уже нет.

Кэш ускорил сайт, но данные иногда устаревают. Что делать?

Это классический признак того, что кэш инвалидируется не по событию, а по времени, или что инвалидация при обмене работает не полностью. Нужно перейти на теговый кэш, связать теги с конкретными товарами и убедиться, что обмен с 1С сбрасывает именно нужные теги. Также стоит проверить, не закэширована ли динамическая часть, которой место в composite или AJAX.

Поделиться:

Каталог тормозит или показывает старые цены?

Настроим композит, теговый кэш и инвалидацию при обмене с 1С — быстро и без вранья о наличии. Рассчитаем работу под ваш каталог.

Игорь Воскресенский

Команда B2Bsite. С 2014 года разрабатываем магазины и порталы на 1С-Битрикс: настраиваем кэш, композит и обмен с 1С так, чтобы каталог был быстрым, а цены и остатки — актуальными.

← Все статьи блога