本指南基于官方文档,详细说明如何在 Spring Boot 3.x 中集成和使用 Caffeine 缓存框架。

Spring Boot 自动配置缓存基础设施,只要启用缓存支持并使用 @EnableCaching 注解即可 [0†]。
如果类路径中存在 Caffeine,Spring Boot 会自动配置 CaffeineCacheManager(由 spring-boot-starter-cache 启动器提供)[0†]。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
<version>3.2.3</version>
</dependency>
在配置类上添加 @EnableCaching 注解:
@Configuration
@EnableCaching
public class CacheConfig {
}
Spring Boot 允许通过多种方式配置 Caffeine 缓存 [0†]:
通过 spring.cache.caffeine.spec 属性配置:
spring.cache.cache-names=cache1,cache2 spring.cache.caffeine.spec=maximumSize=500,expireAfterAccess=600s
定义 CaffeineSpec Bean:
@Bean
public CaffeineSpec caffeineSpec() {
return CaffeineSpec.parse("maximumSize=1000,expireAfterWrite=5m");
}
如果定义了 CacheLoader Bean,它会自动关联到 CaffeineCacheManager:
@Bean
public CacheLoader<Object, Object> cacheLoader() {
return new CacheLoader<Object, Object>() {
@Override
public Object load(Object key) throws Exception {
// 加载逻辑
return null;
}
};
}
通过 CacheManagerCustomizer 接口自定义缓存管理器行为:
@Bean
public CacheManagerCustomizer<ConcurrentMapCacheManager> cacheManagerCustomizer() {
return (cacheManager) -> cacheManager.setAllowNullValues(false);
}
用于标记方法的结果应该被缓存 [8†]:
@Service
public class UserService {
@Cacheable(value = "users", key = "#id")
public User findById(Long id) {
// 查询逻辑
return user;
}
}
更新缓存但不阻止方法执行:
@CachePut(value = "users", key = "#user.id")
public User updateUser(User user) {
// 更新逻辑
return user;
}
从缓存中移除条目:
@CacheEvict(value = "users", key = "#id")
public void deleteUser(Long id) {
// 删除逻辑
}
Caffeine 提供 JSR-107 (JCache) 标准接口的实现 [41†]。通过 JCache,可以在不同缓存实现之间轻松切换。
Caffeine 通过 JCache 提供了对 Spring 的集成支持。Spring Cache 从 4.3 版本和 Spring Boot 1.4 版本开始支持 Caffeine [41†]。
@Configuration
@EnableCaching
public class CaffeineCacheConfig {
@Bean
public CacheManager cacheManager() {
CaffeineCacheManager cacheManager = new CaffeineCacheManager();
cacheManager.setCaffeine(Caffeine.newBuilder()
.maximumSize(1000)
.expireAfterWrite(Duration.ofMinutes(5))
.recordStats());
return cacheManager;
}
}
Caffeine 是一个高性能的缓存库,提供了接近最优的命中率 [3†]。
主要特性:
Caffeine 提供了多种框架集成:
@Entity
public class Product {
@Id
@GeneratedValue
private Long id;
private String name;
private BigDecimal price;
// getters and setters
}
public interface ProductRepository extends JpaRepository<Product, Long> {
}
@Service
@CacheConfig(cacheNames = "products")
public class ProductService {
@Autowired
private ProductRepository productRepository;
@Cacheable(key = "#id")
public Product findById(Long id) {
return productRepository.findById(id).orElse(null);
}
@Cacheable(key = "'all'")
public List<Product> findAll() {
return productRepository.findAll();
}
@CachePut(key = "#product.id")
public Product save(Product product) {
return productRepository.save(product);
}
@CacheEvict(key = "#id")
public void deleteById(Long id) {
productRepository.deleteById(id);
}
}
# application.properties # 启用缓存 spring.cache.type=caffeine # 配置缓存名称 spring.cache.cache-names=products,users # Caffeine 特定配置 spring.cache.caffeine.spec=maximumSize=1000,expireAfterWrite=10m,recordStats
@Configuration
@EnableCaching
public class AdvancedCacheConfig {
@Bean
public CacheManager cacheManager() {
CaffeineCacheManager cacheManager = new CaffeineCacheManager();
// 配置产品缓存
cacheManager.registerCache("products", Caffeine.newBuilder()
.maximumSize(1000)
.expireAfterWrite(Duration.ofMinutes(10))
.recordStats()
.build());
// 配置用户缓存
cacheManager.registerCache("users", Caffeine.newBuilder()
.maximumSize(500)
.expireAfterAccess(Duration.ofMinutes(5))
.recordStats()
.build());
return cacheManager;
}
}
启用统计功能以监控缓存性能:
@Bean
public CacheManager cacheManager() {
CaffeineCacheManager cacheManager = new CaffeineCacheManager();
cacheManager.setCaffeine(Caffeine.newBuilder()
.maximumSize(1000)
.expireAfterWrite(Duration.ofMinutes(5))
.recordStats()); // 启用统计
return cacheManager;
}
@Cacheable(value = "products", condition = "#id != null && #id > 0")
public Product findById(Long id) {
return productRepository.findById(id).orElse(null);
}
缓存未生效
@EnableCaching 已启用内存泄漏
性能问题
启用缓存统计以监控性能:
@Component
public class CacheMonitor {
@EventListener
public void onCacheEvent(CacheEvent event) {
// 监控缓存事件
System.out.println("Cache event: " + event.getType());
}
}
通过遵循本指南,您可以成功在 Spring Boot 3.x 应用中集成 Caffeine 缓存框架,提高应用的性能和响应速度。关键在于合理配置缓存策略,监控缓存性能,并根据实际使用情况进行优化。
如需更多详细信息,请参考: