БонусБесплатный первый месяц абонентской поддержки при заказе разработки «под ключ»

Кэширование на бэкенде: Redis для каталога, корзины и сессий

Кэширование на бэкенде: Redis для каталога, корзины и сессий в 1С-Битрикс — managed cache, инвалидация тегами и отказоустойчивость

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

Разберём, как использовать Redis для кэша каталога, корзины и сессий в 1С-Битрикс: чем он лучше файлового кэша, как разделить данные по базам, настроить инвалидацию тегами и обеспечить отказоустойчивость. Практическую настройку под ваш проект закрывает услуга настройки Redis и Memcached для Битрикс.

Коротко

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

Зачем выносить кэш в Redis

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

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

Файловый кэш и его пределы

По умолчанию 1С-Битрикс кэширует в файлы. Для типового сайта это нормально, но у файлового кэша есть потолок:

Пока трафик небольшой, эти пределы не мешают. Но при росте каталога и посещаемости они превращаются в стену, о которую упирается скорость. Тогда и переходят на кэш в памяти.

Оформление заказа по шагам КорзинатоварыДанныеконтактыДоставкаспособ, адресОплатаспособ оплатыСпасибозаказ созданЧем короче и понятнее шаги оформления, тем меньше брошенных корзин.
Схема: Чем короче и понятнее шаги оформления, тем меньше брошенных корзин.

Три задачи: каталог, корзина, сессии

Важно с самого начала понимать: Redis для магазина решает три разные задачи, и относиться к ним нужно по-разному. Смешать их — типичная ошибка.

ЗадачаТип данныхЧто при потереТребование
Кэш каталогаВременныйПересоберётсяСкорость, вытеснение
КорзинаЦенные данныеРаздражает клиентаПерсистентность
СессииЦенные данныеРазлогиниваниеСохранность, реплика

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

Кэш каталога в Redis

Каталог — главный потребитель кэша: разделы, элементы, свойства, результаты умного фильтра, меню. В Битрикс это закрывается managed cache и кэшем компонентов, который переводят на Redis. Выигрыш прямой: повторные обращения к каталогу отдаются из памяти, не дёргая базу.

Ключевой нюанс каталожного кэша — актуальность. Товары меняются обменом из 1С: приходят новые цены, остатки, характеристики. Если кэш не сбрасывать точечно, покупатель увидит устаревшие данные; если сбрасывать весь — потеряется весь выигрыш. Решение — теговая инвалидация, о которой ниже. Про механику кэша и композита мы подробно писали в статье про Redis и Memcached в Битрикс.

Хранение корзины

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

Но корзина — не кэш: её нельзя молча терять. Поэтому:

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

Сессии и балансировка серверов

Сессии в Redis — то, что делает возможной честную балансировку нагрузки. При файловых сессиях пользователь «прилипает» к серверу, где создалась его сессия, и балансировщик вынужден всегда слать его туда же. Если этот сервер перегружен или упал — проблемы. Redis снимает привязку: сессия лежит в общем хранилище, и запрос обслуживает любой узел.

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

Разделение баз под разные данные

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

  1. База кэша. Временные данные каталога; допустимо вытеснение, персистентность не критична.
  2. База сессий. Ценные данные; сохранность включена, вытеснение отключено.
  3. База корзин. Ценные данные покупателей; персистентность и защита от вытеснения.

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

Инвалидация кэша тегами

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

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

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

Память и политика вытеснения

Redis живёт в оперативной памяти, и памяти должно хватать. Планируют объём с запасом под кэш каталога, активные сессии, корзины и пики трафика. Но память конечна, поэтому настраивают политику вытеснения (maxmemory-policy) — правило, что делать при заполнении.

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

Отказоустойчивость и реплики

Redis, будучи единственной точкой, становится единой точкой отказа: если он падает — падает сайт. Уровень защиты выбирают по критичности данных:

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

Подключение в 1С-Битрикс

Технически подключение сводится к настройке конфигурации и проверке:

  1. Установите и настройте Redis. Отдельный сервис с достаточной памятью, персистентностью для нужных баз и политикой вытеснения.
  2. Пропишите кэш в .settings.php. Укажите тип кэша redis и параметры соединения — managed cache пойдёт через Redis.
  3. Переведите сессии. Настройте хранение сессий в Redis в отдельной базе.
  4. Разнесите данные. Кэш, сессии и корзины — по разным базам или инстансам.
  5. Настройте теговую инвалидацию. Сброс кэша по тегам на события обмена с 1С.
  6. Проверьте под нагрузкой. Нагрузочный тест, мониторинг памяти, поведение при сбросе кэша и перезапуске.

Чтобы изменения инфраструктуры не разъезжались между окружениями, их проводят через управляемый деплой. Про это — в статье про CI/CD и деплой на Битрикс, а про безопасность доступа к сервисам — в материале про REST и вебхуки.

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

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

  1. Redis установлен и настроен. Память с запасом, персистентность для нужных баз, политика вытеснения.
  2. Кэш переведён. Managed cache и кэш компонентов работают через Redis.
  3. Сессии в Redis. Хранение сессий вынесено, балансировка без «прилипания».
  4. Корзина в быстром хранилище. С персистентностью и в отдельной базе.
  5. Данные разнесены. Кэш, сессии, корзины — по разным базам/инстансам.
  6. Теговая инвалидация. Сброс по тегам на события обмена с 1С.
  7. Отказоустойчивость. Реплика и failover для ценных данных, бэкапы.
  8. Проверено под нагрузкой. Нагрузочный тест, мониторинг памяти и поведения при сбросе.

Вывод

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

Добавьте теговую инвалидацию, связанную с обменом из 1С, — и каталог станет и быстрым, и всегда актуальным. Продумайте отказоустойчивость до нагрузки, а не после сбоя. Настроенный так Redis — один из самых сильных рычагов производительности highload-магазина на 1С-Битрикс.

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

Чем Redis лучше файлового кэша в Битрикс?

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

Можно ли хранить корзину и сессии в Redis?

Да, и на нагруженных проектах это стандартная практика. Сессии в Redis позволяют держать несколько веб-серверов за балансировщиком без «прилипания» пользователя к одному узлу. Корзина, живущая в быстром хранилище, отзывчивее и переживает переключение серверов. Важно только разнести кэш, сессии и данные корзины по разным базам или инстансам, чтобы очистка кэша не задела корзины.

Не потеряется ли корзина при перезапуске Redis?

Зависит от настройки. Чистый кэш можно терять безболезненно — он пересоберётся. А вот сессии и корзины — это данные, которые терять нельзя, поэтому для них включают персистентность (сохранение на диск) или реплику. Поэтому кэш и пользовательские данные держат раздельно: к кэшу отношение как к временному, к корзине и сессиям — как к ценным данным с бэкапом.

Как настроить Redis для managed cache Битрикс?

В 1С-Битрикс подключение внешнего кэша задаётся в конфигурации (.settings.php) — указывается тип кэша redis и параметры соединения. После этого штатный managed cache и кэш компонентов начинают работать через Redis. Дополнительно проверяют, что памяти достаточно и настроена политика вытеснения, чтобы под нагрузкой Redis не отказывал при заполнении.

Что такое инвалидация кэша тегами?

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

Сколько памяти нужно Redis под каталог и сессии?

Зависит от объёма каталога, числа посетителей и того, что кэшируется. Планируют с запасом: кэш каталога, сессии активных пользователей и корзины должны помещаться в память с резервом на пики. Обязательно настраивают политику вытеснения (maxmemory-policy), чтобы при переполнении Redis вытеснял старый кэш, а не отказывал. Сессии и корзины при этом защищают от вытеснения отдельной базой.

Redis — единая точка отказа? Как это решать?

Если Redis один и он падает, страдает весь сайт — это риск. Решают репликой и отказоустойчивой схемой (Sentinel или кластер), чтобы при падении мастера подхватывала реплика. Для кэша допустима более простая схема с быстрым восстановлением, а для сессий и корзин — обязательно резервирование, ведь их потеря заметна пользователю. Уровень надёжности выбирают по критичности данных.

Ускорит ли Redis медленный сайт сам по себе?

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

Чем Redis отличается от Memcached для этих задач?

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

Поделиться:

Магазин упирается в файловый кэш под нагрузкой?

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

Настройка Redis для Битрикс

Редакция B2Bsite

Команда B2Bsite. С 2014 года разрабатываем и ускоряем highload-магазины на 1С-Битрикс: Redis и Memcached, композитный сайт, кэширование и отказоустойчивая инфраструктура для среднего и крупного бизнеса.

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