middle
Что такое Caffeine Cache?
Caffeine — это высокопроизводительная in-process кэш-библиотека для Java, являющаяся современной заменой Guava Cache и использующая алгоритм Window TinyLFU для достижения near-optimal hit rate.
Создание и использование кэша
Пример
// Создание кэша
Cache<Long, User> cache = Caffeine.newBuilder()
.maximumSize(10_000) // макс. элементов
.expireAfterWrite(Duration.ofMinutes(10)) // TTL после записи
.expireAfterAccess(Duration.ofMinutes(5)) // TTL после последнего доступа
.recordStats() // включить метрики
.build();
// Ручное использование
cache.put(1L, user);
User cached = cache.getIfPresent(1L); // null если отсутствует
User loaded = cache.get(1L, id -> loadFromDb(id)); // загрузить при промахе
LoadingCache — автоматическая загрузка
Пример
LoadingCache<Long, User> loadingCache = Caffeine.newBuilder()
.maximumSize(10_000)
.expireAfterWrite(Duration.ofMinutes(10))
.refreshAfterWrite(Duration.ofMinutes(8)) // фоновое обновление
.build(id -> userRepository.findById(id).orElseThrow());
User user = loadingCache.get(1L); // при промахе — автоматически загрузит из БД
Caffeine как Spring CacheManager
Пример
@Configuration
@EnableCaching
public class CacheConfig {
@Bean
public CacheManager cacheManager() {
CaffeineCacheManager manager = new CaffeineCacheManager();
manager.setCaffeine(Caffeine.newBuilder()
.maximumSize(5_000)
.expireAfterWrite(Duration.ofMinutes(10))
.recordStats());
return manager;
}
}
Мониторинг
Пример
CacheStats stats = cache.stats();
stats.hitRate(); // процент попаданий
stats.missRate(); // процент промахов
stats.evictionCount(); // количество вытесненных элементов
stats.loadCount(); // количество загрузок
Caffeine vs Guava Cache vs ConcurrentHashMap
| Характеристика | Caffeine | Guava Cache | ConcurrentHashMap |
|---|---|---|---|
| Алгоритм вытеснения | W-TinyLFU (near-optimal) | LRU | Нет (ручное управление) |
| TTL | Да (expireAfter*) | Да | Нет |
| Автозагрузка | LoadingCache | LoadingCache | Нет |
| Статистика | Да (recordStats) | Да | Нет |
| Refresh | refreshAfterWrite | refreshAfterWrite | Нет |
| Производительность | Высокая (concurrent) | Средняя | Высокая (без eviction) |
Ключевые принципы
- Caffeine использует алгоритм Window TinyLFU — лучший hit rate среди in-process кэшей (лучше LRU)
recordStats()— обязательно для production; без метрик невозможно оценить эффективностьrefreshAfterWrite— ключ к предотвращению cache stampede для горячих данных- Caffeine — замена Guava Cache и
ConcurrentHashMap-based кэшей
Частые ошибки
- Не ограничить
maximumSize— кэш растёт бесконечно, приводя к OOM expireAfterWrite+expireAfterAccessодновременно — данные удаляются по первому наступившему условию; обычно достаточно одного- Caffeine в микросервисах без L2 — каждый экземпляр имеет свой кэш; при обновлении данные рассинхронизируются
Как используется в 2026
- Caffeine — стандартный in-process кэш в Spring экосистеме
- Spring Boot:
spring.cache.type=caffeine— одна строка конфига - Caffeine + Micrometer — автоматический экспорт метрик в Prometheus/Grafana
На собеседовании: интервьюер хочет услышать про алгоритм W-TinyLFU и почему Caffeine лучше Guava Cache. Частая ошибка — не знать про
refreshAfterWriteиrecordStats().