Карта / Кэширование / Зачем кэш, уровни кэша

Зачем кэш, уровни кэша

Кэш — быстрая “полка” рядом с местом использования данных, чтобы не ходить каждый раз за ними в медленное место (базу данных, внешний 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-го слоя).