~ / blog / series / kesh-fragmentov-redis

Кэш фрагментов и Redis

Цикл о кэше ajax-блоков: stale-while-revalidate, ключи, сторож полноты, реестр ячеек, перенос в Redis и формы на кэшированных страницах.

#Кэширование 2 мин

Почему ajax-блокам нужен свой кэш

admin-ajax — это POST с no-store, nginx его не кэширует: сетка на 24 карточки — 2 с, пагинация — 2,2 с. После своего кэша — 0,2 с. Главный приём: чистая функция рендера, которую зовут и ajax, и фоновый воркер.

· · ·
#Кэширование 2 мин

От версий в ключе к stale-while-revalidate

Версия в ключе — бесплатная инвалидация, но до 3 ГБ сирот в сутки и MISS после каждого сброса. Версии в значении: смена кода — MISS, смена данных — STALE и горячая задача. Версии по разделам и срок жизни 7 дней.

· · ·
#Кэширование 2 мин

Что обязано входить в ключ ajax-блока

Хост — иначе воркер пишет телефоны основного сайта в ячейки поддомена. Мобильность из User-Agent — строка false прошла isset, и десктоп получал мобильную сетку. Параметры формы — иначе все видят товар первого открывшего.

· · ·
#Кэширование 2 мин

Фоновый рендер наследует не то окружение

Воркер в командной строке без HTTPS собирает http-ссылки — карточки без картинок на https-сайте. Та же ошибка в генераторе миниатюр: 47 постеров по http. Чек-лист окружения и почему проверочный скрипт видел 167 промахов из 167.

· · ·
#Кэширование 2 мин

Изоляция рендера: воркер в одном процессе травит кэш

Переменная запроса из шаблона товара доживала до конца прогона воркера: 134 из 139 ячеек без вкладок, все HIT, сторож доволен. Снимок и восстановление состояния, маркеры по группам и вторая беда — Cannot redeclare по кругу.

· · ·
#Кэширование 1 мин

Пустой ответ — это результат, а не ошибка

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

· · ·
#Кэширование 2 мин

Перечень ячеек собирается сам: обходчик читает разметку

Обходчик страниц вынимает из HTML контейнеры блоков с параметрами и пишет их в реестр — охват вырос с «главная и категории» до 1030 ячеек. Все параметры — в разметке, остальное — из реестра живых запросов.

· · ·
#Кэширование 2 мин

Сторож полноты кэша: сверка раз в 5 минут за 0,05 секунды

Сверять версию кода, а не наличие: после выката все ячейки на месте, но холодные. LIKE по значению — 10,79 с, время истечения минус срок — 0,05 с с точностью 99,7 %. Перечень теми же функциями, что очередь: 1202 против 1156 — это дыра.

· · ·
#Кэширование 2 мин

Реестр, который может только расти, и решение не сокращать ячейки

Прогрев сам продлевал ячейкам жизнь: 31 115 из 31 115 «тронуты за сутки». Когда отметки перестали врать — 24 264 холодных, 88 % из них один блок. И почему мы греем всё видимое, хотя посетители трогают 55 ячеек в час.

· · ·
#Кэширование 2 мин

Голодание хвоста очереди прогрева

Волны обмена каждые ~10 минут заново ставили первые страницы категорий вперёд — вторая–шестая не рендерились никогда, MISS 0,9–2,3 с спустя часы. Резерв в бюджете прогона под дальние страницы и порядок приоритетов.

· · ·
#Кэширование 1 мин

SWR не спасает холодную ячейку: фильтры надо засевать заранее

Устаревшее можно отдать мгновенно, отсутствующее — нет. Фильтр на 22 категории: 18 из 22 MISS по 1,93 с. Засев по категориям на редких событиях, точечный — на обмене, и почему счётчику терминов верить нельзя. Сортировки не греем.

· · ·
#Кэширование 1 мин

Параметры прогрева должны совпадать с фронтом бит в бит

Открытые DevTools сузили окно — фронт прислал другие параметры, и прогретый блок дал MISS прямо на демо. Не тот тип записей, не та группировка (259 товаров — 5 страниц на компьютере и 8 на телефоне). Параметры — из серверной разметки.

· · ·
#Кэширование 2 мин

Перенос кэша фрагментов из wp_options в Redis

Таблица опций — 88 % базы, 3,24 ГБ при 739 МБ полезных. Чистка и OPTIMIZE: база 3,7 ГБ → 1 ГБ. Redis с noeviction, версией кода в имени ключа и сжатием в 27,6 раза, откат на временные записи и виджет, который врал в 8 раз.

· · ·
#Кэширование 2 мин

Мёртвые поколения ключей в Redis и сколько памяти ему давать

При noeviction старые поколения не «истекут сами» — они съедят память, и Redis откажет в записи. SCAN с UNLINK: 45 611 ключей за 0,32 с, 252 → 14,65 МБ. Формула памяти на два поколения: 32 269 ячеек — 181 МБ, лимит 1 ГБ.

· · ·
#Кэширование 2 мин

Виджет мониторинга кэша в админке: что показывать, чтобы это было полезно

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

· · ·
#Кэширование 2 мин

Токен формы в кэшированной странице: заявки теряются молча

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

· · ·
#Кэширование 2 мин

Всплывающая форма: из кэша и без кэша одинаково 180 мс

Почти все 180 мс — вход в WordPress, а не рендер, поэтому прогрев не помогает. Лечит фронт: параллельная загрузка, запрос вместе с анимацией, промис на вкладку и загрузка по наведению с форой 300–800 мс. И почему не грузить формы всем.

· · ·

$ tail -f /blog

Не пропустите новые статьи

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

В Telegramодна кнопка «Старт» в боте

или на почту

связаться

Расскажите о задаче