Spring Boot 集成 Caffeine 本地缓存配置指南
Caffeine 是一个基于 Java 8 StampedLock 的高性能本地缓存库,相比 Ehcache 和 Redis,它完全在进程内运行,无网络开销且无需对象序列化。本文将指导如何在 Spring Boot 应用中通过 SimpleCacheManager 集成 Caffeine,实现不同 TTL(生存时间)的多种缓存命名空间配置。
Caffeine 与常用缓存对比
在架构选型时,理解本地缓存与分布式缓存的区别至关重要。Caffeine 作为内存型缓存,其数据存储在 JVM 堆内存中,应用重启即丢失。以下是它与 Redis、EhCache 的核心差异:
| 特性 | Redis | EhCache | Caffeine |
|---|---|---|---|
| 序列化需求 | 必须实现 | 可选(若持久化则需) | 不需要 |
| 进程关系 | 独立进程 | 附着于业务进程 | 附着于业务进程 |
| 存储介质 | 内存 + 磁盘 | 内存 / 磁盘 | 纯内存 |
JDK 原生 Map 虽可作为临时存储,但缺乏自动过期和淘汰机制,不适合正式缓存场景。Caffeine 作为 Guava Cache 的改进版,提供了更优秀的并发控制和淘汰策略。
Spring Boot 集成步骤
第1步:引入依赖
首先需要引入 Caffeine 核心库以及 Spring Context Support 以支持注解驱动缓存。建议使用较新的 Spring Boot 版本自带的管理依赖:
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
第2步:全局启用 Caffeine
在 application.yml 或 properties 中指定 Spring Cache 的实现类型为 caffeine,这将告诉 Spring 使用默认的管理器进行缓存操作:
spring:
cache:
type: caffeine
第3步:自定义多 CacheName 配置
不同的业务模块通常对缓存时效性有不同要求。通过注册 SimpleCacheManager 并为每个缓存实例绑定不同的 Caffeine 构建器,可以实现精细化的控制。
首先定义常量类用于区分不同的缓存区域:
public interface CacheNameTimeConstant {
String CACHE_DEFAULT = "CACHE_DEFAULT";
String CACHE_5SECS = "CACHE_5SECS";
String CACHE_10SECS = "CACHE_10SECS";
String CACHE_60SECS = "CACHE_60SECS";
}
随后,创建 Bean 来配置具体的缓存管理器,这里演示了三种不同过期时间的配置:
@Bean
public CacheManager caffeineCacheManager() {
SimpleCacheManager cacheManager = new SimpleCacheManager();
List<CaffeineCache> caches = new ArrayList<>();
// 配置5秒过期的缓存
caches.add(new CaffeineCache(
CacheNameTimeConstant.CACHE_5SECS,
Caffeine.newBuilder().expireAfterWrite(5, TimeUnit.SECONDS).build()
));
// 配置10秒过期的缓存
caches.add(new CaffeineCache(
CacheNameTimeConstant.CACHE_10SECS,
Caffeine.newBuilder().expireAfterWrite(10, TimeUnit.SECONDS).build()
));
// 配置30秒过期的缓存
caches.add(new CaffeineCache(
CacheNameTimeConstant.CACHE_30SECS,
Caffeine.newBuilder().expireAfterWrite(30, TimeUnit.SECONDS).build()
));
cacheManager.setCaches(caches);
return cacheManager;
}
使用注意事项
由于 Caffeine 是本地内存缓存,不经过网络传输,因此存入其中的实体对象无需实现 Serializable 接口,这简化了代码开发。但如果未来需要对接多级缓存(如 Redis),则需注意这部分对象在不同缓存层级间的序列化一致性。
以上就是通过 Spring Cache 注解结合 Caffeine 实现高性能本地缓存的详细配置过程,开发者可根据实际业务场景调整过期时间和缓存大小限制。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









