Арифметика. При потоке 50 000 RPS и hit ratio 90% в базу идёт 5 000 RPS, при 99% — 500, при 99,9% — 50. Последние девятки дают самый большой эффект на базу, но достаются всё дороже по памяти.
От чего зависит hit ratio:
- распределение популярности — запросы к контенту обычно следуют закону Ципфа: небольшая доля ключей получает основную долю запросов. Поэтому кэш на 1–5% данных часто даёт 80–95% попаданий, а дальше рост медленный;
- размер кэша относительно рабочего набора;
- TTL — короткий TTL снижает попадания даже при достаточной памяти;
- политика вытеснения и защита от сканирования;
- ключи — разные ключи для одного и того же (параметры в разном порядке, лишние поля) дробят кэш.
Время ответа. Средняя задержка = hit × t_кэша + miss × t_базы. При кэше 1 мс и базе 20 мс: 90% → 2,9 мс, 99% → 1,2 мс.
Опасность зависимости от кэша. Со временем база начинает держать только промахи, и её «оптимизируют» под эту нагрузку. Если кэш упал или перезапустился пустым (холодный), в базу пойдёт в 10–100 раз больше запросов — и она ляжет, после чего не прогреть и кэш. Как защищаться:
- база рассчитана хотя бы на заметную часть нагрузки без кэша, или перед ней ограничитель параллелизма (лучше отказать части, чем всем);
- кэш с репликами и постоянством (Redis replica, Sentinel/Cluster), а не один экземпляр;
- постепенный прогрев: снять дамп горячих ключей и загрузить, или пускать трафик на новый узел кэша порциями;
- схлопывание запросов — при промахе по одному ключу в базу идёт один запрос, остальные ждут его;
- двухуровневый кэш — локальный в памяти сервиса на секунды гасит горячие ключи даже при недоступном общем;
- устаревшие данные при ошибке — отдать прошлое значение, если обновить не удалось (stale-if-error).
Отрицательное кэширование. Запросы к несуществующим ключам (опечатки, боты, атака перебором id) — всегда промахи. Кэшировать «не найдено» на короткое время или ставить фильтр Блума перед базой.
Метрики: hit ratio по типам ключей, задержка кэша и базы, вытеснения (evictions), память, число ключей; алерт на падение hit ratio — ранний сигнал проблем.