На каких уровнях архитектуры приложения может располагаться кеш (cache)?

Ответ

Кеш применяется на разных уровнях для ускорения доступа к данным и снижения нагрузки. Вот основные уровни:

Уровень Технологии / Место Цель
Клиентский (Браузер) HTTP-кеш, LocalStorage, SessionStorage, Cookies Снизить число запросов к серверу, ускорить загрузку страниц.
Сетевой (CDN/Прокси) Cloudflare, AWS CloudFront, Nginx/Apache как reverse proxy Кеширование статики (CSS, JS, изображения) ближе к пользователю.
Серверный (Приложение) In-memory кеш процесса (Python lru_cache, Java Caffeine), Redis, Memcached Кеширование результатов вычислений, данных из БД, сессий.
Уровень базы данных Встроенный кеш СУБД (например, InnoDB Buffer Pool в MySQL), Redis как кеш-слой перед БД Ускорение частых запросов к БД, снижение нагрузки на дисковые операции.
Аппаратный (CPU/Диск) L1/L2/L3 кеш CPU, SSD/HDD cache Ускорение работы процессора и дисковых операций (прозрачно для приложения).

Пример HTTP-кеширования на клиенте:

HTTP/1.1 200 OK
Cache-Control: public, max-age=3600
ETag: "abc123"
Last-Modified: Wed, 21 Oct 2022 07:28:00 GMT

Почему многоуровневый кеш? Каждый уровень решает свою задачу: клиентский разгружает сервер, CDN — разгружает backend, серверный — разгружает базу данных. Важно правильно настроить инвалидацию (обновление) кеша на каждом уровне.

Ответ 18+ 🔞

Да ты посмотри, какая многоэтажная конструкция, блядь! Это ж как многоэтажка, только для данных, ёпта. Чтоб всё быстрее бегало, а не тормозило, как пьяный мужик по льду.

Вот смотри, как это всё, сука, устроено, по полочкам:

Уровень Технологии / Место Цель
Клиентский (Браузер) HTTP-кеш, LocalStorage, SessionStorage, Cookies Чтобы не дёргать сервер по каждой ерунде. Страницы чтоб влетали, а не грузились, будто через хуй с горы.
Сетевой (CDN/Прокси) Cloudflare, AWS CloudFront, Nginx/Apache как reverse proxy Картинки, скрипты, стили — всё это раскидать по миру, чтоб у каждого пользователя было под жопой, а не на другом конце света.
Серверный (Приложение) In-memory кеш процесса (Python lru_cache, Java Caffeine), Redis, Memcached Чтоб не вычислять одно и то же по сто раз. Сходил раз в базу, запомнил в Redis — и потом просто отдаёшь из памяти, красота!
Уровень базы данных Встроенный кеш СУБД (InnoDB Buffer Pool в MySQL), Redis как кеш-слой перед БД Сама база тоже не дура, она частые запросы в памяти держит. А то диск — он медленный, блядь, как черепаха в сиропе.
Аппаратный (CPU/Диск) L1/L2/L3 кеш CPU, SSD/HDD cache Это уже магия железа, на уровне процессора и диска. Программист на это обычно не влияет, но без этого нихуя бы не работало так быстро.

Вот, например, как браузеру говорят: «Запомни это, дурачок, на час»:

HTTP/1.1 200 OK
Cache-Control: public, max-age=3600
ETag: "abc123"
Last-Modified: Wed, 21 Oct 2022 07:28:00 GMT

А зачем эта вся хуйня многоуровневая? Да чтобы не было одного слабого звена, блядь! Клиентский кеш — серверу легче. CDN — бэкенду вообще похуй. Серверный кеш — базу не насилует. А база — диск не ебёт. Красиво, да? Но главная, блядь, головная боль — это инвалидация. То есть когда данные поменялись, а кеш-то старый! Надо везде вовремя обновить, иначе пользователь будет видеть хуйню, а не актуальную инфу. Вот где собака зарыта, сука!