Что такое кэширование в программировании?

«Что такое кэширование в программировании?» — вопрос из категории Архитектура, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Кэширование — это техника хранения копии данных или результатов вычислений во временном, но быстродоступном хранилище (кэше) для последующего их быстрого извлечения без необходимости повторного выполнения ресурсоемкой операции (обращения к БД, сложного расчета, сетевого запроса).

Цели: повышение производительности, снижение нагрузки на источник данных и уменьшение задержек.

Базовый пример in-memory кэша на Java:

// Простейший кэш на основе HashMap
Map<String, Object> cache = new HashMap<>();

public Object getData(String key) {
    if (!cache.containsKey(key)) {
        // Дорогая операция (запрос к БД, API-вызов)
        Object data = loadDataFromSource(key);
        cache.put(key, data);
    }
    return cache.get(key);
}

Пример с использованием библиотеки Caffeine:

import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;

Cache<String, Object> cache = Caffeine.newBuilder()
    .expireAfterWrite(10, TimeUnit.MINUTES) // TTL
    .maximumSize(1000) // LRU-политика
    .build();

public Object getData(String key) {
    // Лямбда выполнится только при отсутствии значения в кэше
    return cache.get(key, k -> loadDataFromSource(k));
}

Основные проблемы: инвалидация устаревших данных, обеспечение консистентности в распределенных системах, выбор политики вытеснения (LRU, LFU).