CDN, статика и алгоритмы вытеснения
Доставить байты быстрее можно двумя путями: приблизить их географически (CDN) и грамотно решать, что хранить (вытеснение).
CDN (Content Delivery Network) — сеть серверов по всему миру, кэширующих статику ближе к пользователю, чтобы сократить задержку и разгрузить основной сервер.
Зачем нужен CDN
Если ваш сервер в Москве, а пользователь в Бразилии, каждый запрос летит через океан — это сотни миллисекунд только на дорогу. CDN держит копии файлов на edge-серверах рядом с пользователями. Бразилец получает картинку с ближайшего узла, а не из Москвы.
| Что даёт CDN | Как именно |
| Меньше задержка | контент рядом с пользователем географически |
| Разгрузка сервера | статику отдаёт CDN, а не ваши серверы |
| Защита от пиков | edge поглощает всплески и часть DDoS |
| Экономия полосы | тяжёлые файлы не гоняются через ядро |
Что отдавать через CDN
Идеальные кандидаты — статика, одинаковая для всех: картинки, видео, JS, CSS, шрифты. Динамический персональный контент (личная лента) кэшировать на CDN сложнее, хотя современные CDN умеют и это. Чтобы обновить файл, меняют его имя (версионируют: app.4f2a.js) — старое имя остаётся в кэшах, новое скачивается свежим. Это обходит проблему инвалидации у миллионов клиентов.
Почему нужна политика вытеснения
Память кэша конечна. Когда она заполнена, а пришёл новый элемент, что-то надо выкинуть. От выбора «жертвы» напрямую зависит hit rate. Хорошая политика выкидывает то, что вряд ли скоро понадобится.
Алгоритмы вытеснения
| Политика | Кого выкидывает | Идея / когда хороша |
| LRU (Least Recently Used) | давно не используемый | ставка на локальность во времени; самый ходовой выбор |
| LFU (Least Frequently Used) | реже всего используемый | хорош, когда популярность стабильна |
| FIFO | самый старый по добавлению | прост, но игнорирует частоту использования |
| Random | случайный | дёшево, без структур учёта |
| TTL-based | истёкший по сроку | когда у данных естественный срок свежести |
LRU — почему он по умолчанию
LRU выкидывает элемент, к которому дольше всего не обращались. Логика проста: если данные давно не нужны, скорее всего, не понадобятся и дальше. LRU отлично ловит временну́ю локальность (только что использованное вероятно используется снова) и реализуется за O(1) на хеш-таблице плюс двусвязном списке. Поэтому Redis и большинство кэшей берут его по умолчанию.
Кэш на 3 элемента, политика LRU:
доступ A, B, C → [A B C]
доступ A (освежили) → [B C A]
новый D (нет места) → выкидываем B (давний) → [C A D]
Итог
- CDN приближает статику к пользователю, режет задержку и разгружает сервер; обновляют через версионирование имён.
- Память кэша конечна — нужна политика вытеснения, она определяет hit rate.
- LRU выкидывает давно не используемое, ловит временну́ю локальность и работает за O(1) — потому он по умолчанию.