Карточка товара открывается три секунды. Кто-то предлагает посмотреть запросы. Зачем? Завернём результат в кеш на час. Повторное открытие — почти мгновенно. Задача закрыта, график красивый.
Через десять минут менеджер меняет цену. На сайте остаётся прежняя. «Нужно немного подождать», — объясняем мы. Только что у страницы появилась новая бизнес-логика: изменения принимаются быстро, публикуются по настроению таймера.
В ключ положи самое очевидное
Например, номер товара. Этого ведь достаточно, чтобы понять, какой товар перед нами. Почти.
Представим, что в сохранённый HTML попала персональная скидка. Первым страницу открыл постоянный клиент. Следующий посетитель получил его цену. Если там ещё и блок личного кабинета, обсуждение производительности можно временно отложить.
Мне нравится проверять ключ простым вопросом: могут ли два запроса с этим ключом законно ожидать разные ответы? Язык, валюта, права, организация, параметры фильтра — всё это способно менять результат. Не обязательно включать в ключ весь мир. Но границу общего и персонального придётся определить до сохранения.
Особенно коварно, когда ошибка появляется только после определённой последовательности посетителей. По одному каждый сценарий работает. Вместе они обмениваются результатами.
Назначь одинаковый срок всему
Час — отличное круглое число. Для списка стран оно короткое, для остатка последнего билета — вечность. Зато конфигурация выглядит последовательно.
Я бы начинал со смысла допустимого отставания. Читатель переживёт слегка устаревший счётчик просмотров. Финальную возможность купить товар всё равно нужно проверять по надёжному источнику в операции покупки. Быстрая витрина не должна превращаться в обещание, которое оформление заказа не умеет выполнить.
И не стоит забывать момент, когда кеш пуст. После общего сброса популярная страница может одновременно запустить множество тяжёлых вычислений. Если исходный запрос мы так и не исследовали, он вернётся уже группой.
Сначала выясни, что именно тормозит
Возможно, в карточке десятки однотипных запросов. Возможно, внешний сервис вызывается прямо во время открытия страницы. Или мы каждый раз строим большой результат ради трёх полей. У этих причин разные способы лечения.
После измерения кеш часто остаётся хорошим решением. Но теперь понятно, какой результат сохраняем, кто может его получать, когда он устаревает и что происходит при промахе. Это уже конструкция, которую можно проверить.
Быстрый ответ приятен. Лично мне ещё хочется, чтобы после изменения цены он имел какое-то отношение к новой цене. Кнопка очистки в руках менеджера не должна быть скрытой кнопкой «Сохранить по-настоящему».