Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
claude-dev-suite avatar

Spring Cache

  • 35 installs
  • 27 repo stars
  • Updated July 17, 2026
  • claude-dev-suite/claude-dev-suite

Reference for the Spring Cache abstraction covering @Cacheable, @CacheEvict, @CachePut, cache managers (Caffeine, Redis, EhCache), TTL, and cache keys.

About

Documents the Spring Cache abstraction including caching annotations, cache managers like Caffeine and Redis, TTL configuration, and conditional caching. A developer uses it to add declarative caching to a Spring Boot app.

  • @Cacheable, @CacheEvict, and @CachePut annotations
  • Cache managers (Caffeine, Redis, EhCache) and TTL

Spring Cache by the numbers

  • 35 all-time installs (skills.sh)
  • Ranked #48 of 89 Java & JVM skills by installs in the Skillselion catalog
  • Data as of Jul 29, 2026 (Skillselion catalog sync)
npx skills add https://github.com/claude-dev-suite/claude-dev-suite --skill spring-cache

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs35
repo stars27
Last updatedJuly 17, 2026
Repositoryclaude-dev-suite/claude-dev-suite

What it does

Reference for the Spring Cache abstraction covering @Cacheable, @CacheEvict, @CachePut, cache managers (Caffeine, Redis, EhCache), TTL, and cache keys.

Files

SKILL.mdMarkdownGitHub ↗

Spring Cache

Quick Start

@SpringBootApplication
@EnableCaching
public class Application {}

@Service
public class UserService {

    @Cacheable("users")
    public User findById(Long id) {
        return userRepository.findById(id).orElseThrow();
    }

    @CacheEvict(value = "users", key = "#id")
    public void deleteUser(Long id) {
        userRepository.deleteById(id);
    }
}
spring:
  cache:
    type: caffeine
    caffeine:
      spec: maximumSize=1000,expireAfterWrite=10m

---

Cache Annotations

@Cacheable

@Cacheable("products")
public Product findById(Long id) { }

@Cacheable(value = "products", key = "#category + '-' + #status")
public List<Product> findByCategoryAndStatus(String category, String status) { }

@Cacheable(value = "products", condition = "#id > 0")
public Product findByIdConditional(Long id) { }

@Cacheable(value = "products", unless = "#result == null")
public Product findByIdUnlessNull(Long id) { }

@Cacheable(value = "products", sync = true)  // One thread populates
public Product findByIdSync(Long id) { }

@CacheEvict

@CacheEvict(value = "products", key = "#id")
public void deleteProduct(Long id) { }

@CacheEvict(value = "products", allEntries = true)
public void clearProductCache() { }

@CacheEvict(value = "products", key = "#id", beforeInvocation = true)
public void deleteProductBeforeInvocation(Long id) { }

@CachePut

@CachePut(value = "products", key = "#product.id")
public Product saveProduct(Product product) {
    return productRepository.save(product);
}

@CachePut(value = "products", key = "#result.id")
public Product createProduct(CreateProductRequest request) {
    return productRepository.save(new Product(request));
}

@Caching (Multiple Operations)

@Caching(
    put = {
        @CachePut(value = "products", key = "#result.id"),
        @CachePut(value = "productsBySku", key = "#result.sku")
    },
    evict = {
        @CacheEvict(value = "productList", allEntries = true)
    }
)
public Product createProduct(CreateProductRequest request) { }

@CacheConfig (Class-Level)

@Service
@CacheConfig(cacheNames = "products", keyGenerator = "customKeyGenerator")
public class ProductService {

    @Cacheable  // Uses class config
    public Product findById(Long id) { }

    @Cacheable(cacheNames = "inventory")  // Override cache name
    public Inventory getInventory(Long productId) { }
}
Full Reference: See managers.md for Caffeine, Redis, EhCache configurations.

---

Quick Cache Manager Setup

Caffeine (Single Instance)

@Bean
public CacheManager cacheManager() {
    CaffeineCacheManager manager = new CaffeineCacheManager();
    manager.setCaffeine(Caffeine.newBuilder()
        .maximumSize(10_000)
        .expireAfterWrite(Duration.ofMinutes(10))
        .recordStats());
    return manager;
}

Redis (Distributed)

@Bean
public CacheManager cacheManager(RedisConnectionFactory factory) {
    RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
        .entryTtl(Duration.ofMinutes(10))
        .serializeValuesWith(SerializationPair
            .fromSerializer(new GenericJackson2JsonRedisSerializer()));

    return RedisCacheManager.builder(factory)
        .cacheDefaults(config)
        .build();
}
Full Reference: See advanced.md for Multi-Level Caching, Metrics, Synchronization.

---

Best Practices

DoDon't
Use Caffeine for single-instanceSkip TTL configuration
Use Redis for distributedCache mutable objects
Configure TTL alwaysIgnore cache eviction
Use sync=true for expensive opsUse high cardinality keys
Implement cache metricsCache sensitive data unencrypted

---

Production Checklist

  • [ ] Cache provider configured (Caffeine/Redis)
  • [ ] TTL configured for every cache
  • [ ] Cache eviction on write operations
  • [ ] Metrics configured
  • [ ] Serialization tested
  • [ ] Distributed lock for critical ops

---

When NOT to Use This Skill

  • Distributed caching - Use spring-data-redis
  • Redis operations - Use redis skill
  • Session storage - Use Spring Session

---

Common Pitfalls

ErrorCauseSolution
Cache not workingInternal call (same bean)Use self-injection
Null pointerNull values cachedUse unless = "#result == null"
Memory leakTTL not configuredSet expireAfterWrite
Serialization errorNon-serializable objectsImplement Serializable

---

Anti-Patterns

Anti-PatternProblemSolution
Caching mutable objectsStale dataCache immutable data
No TTL configuredStale cache foreverSet expireAfterWrite
@Cacheable on voidNo effectOnly cache with return
No cache syncRace conditionsUse sync=true or locks

---

Quick Troubleshooting

ProblemDiagnosticFix
Cache not workingCheck @EnableCachingAdd annotation
Wrong data cachedCheck cache keyDefine explicit key
Cache not evictedCheck key expressionVerify key matches
Self-invocation bypassSame class callInject self

---

Reference Files

FileContent
managers.mdCaffeine, Redis, EhCache, Key Generators
advanced.mdMulti-Level, Metrics, Sync, Testing

---

External Documentation

Related skills

Java & JVMbackend

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.