[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-spring-chto-takoe-spring-cache-i-kak-ego-ispolzovat":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":15,"progress":16,"seo":17},654,"chto-takoe-spring-cache-i-kak-ego-ispolzovat",14,"spring","Spring","🌱","Что такое Spring Cache и как его использовать?","Spring Cache -- абстракция кэширования, позволяющая декларативно (через аннотации) кэшировать результаты методов без привязки к конкретной реализации кэша.\n\n### Подключение\n\n```java\n@SpringBootApplication\n@EnableCaching\npublic class MyApplication { }\n```\n\n### Основные аннотации\n\n```java\n@Service\npublic class UserService {\n\n    \u002F\u002F Кэширует результат. При повторном вызове с тем же ключом\n    \u002F\u002F метод НЕ выполняется, результат берётся из кэша\n    @Cacheable(value = \"users\", key = \"#id\")\n    public UserDto findById(Long id) {\n        return userRepository.findById(id).map(this::toDto).orElseThrow();\n    }\n\n    \u002F\u002F Условное кэширование\n    @Cacheable(value = \"users\", key = \"#id\", unless = \"#result == null\")\n    public UserDto findByIdConditional(Long id) { }\n\n    \u002F\u002F Всегда выполняет метод и обновляет кэш\n    @CachePut(value = \"users\", key = \"#result.id\")\n    public UserDto updateUser(UpdateUserRequest request) { }\n\n    \u002F\u002F Удаляет запись из кэша\n    @CacheEvict(value = \"users\", key = \"#id\")\n    public void deleteUser(Long id) { }\n\n    \u002F\u002F Очистка всего кэша\n    @CacheEvict(value = \"users\", allEntries = true)\n    public void clearUsersCache() { }\n}\n```\n\n### Реализации кэша\n\nПо умолчанию Spring использует `ConcurrentMapCacheManager` (простой HashMap). Для production:\n\n```properties\n# Redis\nspring.cache.type=redis\nspring.cache.redis.time-to-live=600000\n\n# Caffeine (in-memory, рекомендуется для одного экземпляра)\nspring.cache.type=caffeine\nspring.cache.caffeine.spec=maximumSize=500,expireAfterWrite=10m\n```\n\n> **На собеседовании:** ключевое -- знание аннотаций (`@Cacheable`, `@CachePut`, `@CacheEvict`) и их различий. Частая ошибка -- забыть инвалидировать кэш при обновлении данных. Также проблема self-invocation: вызов `@Cacheable`-метода из того же класса не кэшируется (та же проблема, что и с `@Transactional`).","","middle",[7],[],null,{"title":18,"description":19,"ogTitle":18,"ogDescription":20,"keywords":21,"schemaAnswer":19,"featuredSnippetReady":22},"Что такое Spring Cache и как его использовать? — Gymterview","Spring Cache -- абстракция кэширования, позволяющая декларативно (через аннотации) кэшировать результаты методов без привязки к конкретной реализации кэша.","Spring Cache -- абстракция кэширования, позволяющая декларативно (через аннотации) кэшировать результаты методов без при",[7,13],true]