[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-keshirovanie-chto-takoe-caffeine-cache":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":20,"progress":21,"seo":22},187,"chto-takoe-caffeine-cache",5,"keshirovanie","Кеширование","⚡","Что такое Caffeine Cache?","Caffeine — это высокопроизводительная in-process кэш-библиотека для Java, являющаяся современной заменой Guava Cache и использующая алгоритм Window TinyLFU для достижения near-optimal hit rate.\n\n### Создание и использование кэша\n\n```java\n\u002F\u002F Создание кэша\nCache\u003CLong, User> cache = Caffeine.newBuilder()\n    .maximumSize(10_000)                          \u002F\u002F макс. элементов\n    .expireAfterWrite(Duration.ofMinutes(10))     \u002F\u002F TTL после записи\n    .expireAfterAccess(Duration.ofMinutes(5))     \u002F\u002F TTL после последнего доступа\n    .recordStats()                                 \u002F\u002F включить метрики\n    .build();\n\n\u002F\u002F Ручное использование\ncache.put(1L, user);\nUser cached = cache.getIfPresent(1L);      \u002F\u002F null если отсутствует\nUser loaded = cache.get(1L, id -> loadFromDb(id)); \u002F\u002F загрузить при промахе\n```\n\n### LoadingCache — автоматическая загрузка\n\n```java\nLoadingCache\u003CLong, User> loadingCache = Caffeine.newBuilder()\n    .maximumSize(10_000)\n    .expireAfterWrite(Duration.ofMinutes(10))\n    .refreshAfterWrite(Duration.ofMinutes(8))     \u002F\u002F фоновое обновление\n    .build(id -> userRepository.findById(id).orElseThrow());\n\nUser user = loadingCache.get(1L); \u002F\u002F при промахе — автоматически загрузит из БД\n```\n\n### Caffeine как Spring CacheManager\n\n```java\n@Configuration\n@EnableCaching\npublic class CacheConfig {\n\n    @Bean\n    public CacheManager cacheManager() {\n        CaffeineCacheManager manager = new CaffeineCacheManager();\n        manager.setCaffeine(Caffeine.newBuilder()\n            .maximumSize(5_000)\n            .expireAfterWrite(Duration.ofMinutes(10))\n            .recordStats());\n        return manager;\n    }\n}\n```\n\n### Мониторинг\n\n```java\nCacheStats stats = cache.stats();\nstats.hitRate();       \u002F\u002F процент попаданий\nstats.missRate();      \u002F\u002F процент промахов\nstats.evictionCount(); \u002F\u002F количество вытесненных элементов\nstats.loadCount();     \u002F\u002F количество загрузок\n```\n\n### Caffeine vs Guava Cache vs ConcurrentHashMap\n\n| Характеристика | Caffeine | Guava Cache | ConcurrentHashMap |\n|---------------|----------|-------------|-------------------|\n| Алгоритм вытеснения | W-TinyLFU (near-optimal) | LRU | Нет (ручное управление) |\n| TTL | Да (expireAfter*) | Да | Нет |\n| Автозагрузка | LoadingCache | LoadingCache | Нет |\n| Статистика | Да (recordStats) | Да | Нет |\n| Refresh | refreshAfterWrite | refreshAfterWrite | Нет |\n| Производительность | Высокая (concurrent) | Средняя | Высокая (без eviction) |\n\n### Ключевые принципы\n\n- Caffeine использует алгоритм Window TinyLFU — лучший hit rate среди in-process кэшей (лучше LRU)\n- `recordStats()` — обязательно для production; без метрик невозможно оценить эффективность\n- `refreshAfterWrite` — ключ к предотвращению cache stampede для горячих данных\n- Caffeine — замена Guava Cache и `ConcurrentHashMap`-based кэшей\n\n### Частые ошибки\n\n- **Не ограничить `maximumSize`** — кэш растёт бесконечно, приводя к OOM\n- **`expireAfterWrite` + `expireAfterAccess` одновременно** — данные удаляются по первому наступившему условию; обычно достаточно одного\n- **Caffeine в микросервисах без L2** — каждый экземпляр имеет свой кэш; при обновлении данные рассинхронизируются\n\n### Как используется в 2026\n\n- Caffeine — стандартный in-process кэш в Spring экосистеме\n- Spring Boot: `spring.cache.type=caffeine` — одна строка конфига\n- Caffeine + Micrometer — автоматический экспорт метрик в Prometheus\u002FGrafana\n\n> **На собеседовании:** интервьюер хочет услышать про алгоритм W-TinyLFU и почему Caffeine лучше Guava Cache. Частая ошибка — не знать про `refreshAfterWrite` и `recordStats()`.","","middle",[15,16,17,18,19],"caffeine","in-memory","caching","spring-cache","w-tinylfu",[],null,{"title":23,"description":24,"ogTitle":25,"ogDescription":26,"keywords":27,"schemaAnswer":36,"featuredSnippetReady":37},"Что такое Caffeine Cache — Gymterview","Caffeine Cache — высокопроизводительный in-process кэш для Java. Алгоритм W-TinyLFU, LoadingCache, refreshAfterWrite, мониторинг метрик, интеграция со Spring.","Caffeine Cache: высокопроизводительный in-process кэш для Java — Gymterview","Caffeine — лучший in-process кэш для Java с алгоритмом W-TinyLFU. Примеры, LoadingCache, мониторинг и Spring-интеграция.",[28,29,30,31,32,33,34,35],"Caffeine Cache","in-process кэш","W-TinyLFU","LoadingCache","refreshAfterWrite","Spring CacheManager","Guava Cache замена","Java","Caffeine — высокопроизводительная in-process кэш-библиотека для Java, замена Guava Cache. Использует алгоритм Window TinyLFU с лучшим hit rate среди in-process кэшей. Поддерживает maximumSize, expireAfterWrite\u002FAccess, refreshAfterWrite (фоновое обновление), recordStats (метрики). Интегрируется со Spring через CaffeineCacheManager. Стандарт для L1-кэша в Spring-приложениях.",true]