Зачем кэш, уровни кэша
Кэш — быстрая “полка” рядом с местом использования данных, чтобы не ходить каждый раз за ними в медленное место (базу данных, внешний API). Сходил один раз — положил результат на полку, в следующий раз просто берёшь с полки.
Map<Long, User> cache = new HashMap<>();
User getUser(Long id) {
if (cache.containsKey(id)) {
return cache.get(id); // быстро — из памяти
}
User user = database.findById(id); // медленно — поход в базу
cache.put(id, user);
return user;
}
Копнуть глубже
Уровни кэша — от ближайшего к данным до самого далёкого:
| Уровень | Где живёт | Скорость |
|---|---|---|
| Кэш процессора (L1/L2/L3) | внутри CPU | наносекунды, вне контроля Java-кода |
| Кэш приложения (in-memory) | в памяти JVM (HashMap, Caffeine) | очень быстро, но теряется при перезапуске |
| Распределённый кэш (Redis) | отдельный сервер | быстро, общий для нескольких инстансов приложения |
| База данных | диск | медленнее всего из перечисленного |
Главный компромисс кэша — скорость в обмен на свежесть данных. Если данные в источнике изменились, а кэш ещё хранит старую версию — это называется устаревшие данные (stale data). Поэтому кэш всегда требует продуманной стратегии, когда и как его обновлять (см. тему «Инвалидация кэша») — бездумное кэширование легко приводит к показу неактуальных данных пользователю.
🎤 Закрыл тему, если можешь объяснить:
• зачем нужен кэш и аналогию с полкой рядом;
• уровни кэша от процессора до базы данных и в чём главный компромисс кэширования (если дошёл до 2-го слоя).
• уровни кэша от процессора до базы данных и в чём главный компромисс кэширования (если дошёл до 2-го слоя).