在 Spring Boot 中集成 Caffeine 缓存可以显著提升应用性能,适用于本地内存缓存场景。Caffeine 是一个高性能的 Java 缓存库,支持 TTL(过期时间)、最大条目数、淘汰策略等特性。
✅ 一、添加依赖
Maven:
<!-- pom.xml -->\n<dependencies>\n <!-- Spring Cache 支持 -->\n <dependency>\n <groupId>org.springframework.boot</groupId>\n <artifactId>spring-boot-starter-cache</artifactId>\n </dependency>\n\n <!-- Caffeine 缓存库 -->\n <dependency>\n <groupId>com.github.ben-manes.caffeine</groupId>\n <artifactId>caffeine</artifactId>\n </dependency>\n</dependencies>\nGradle:
// build.gradle\ndependencies {\n implementation 'org.springframework.boot:spring-boot-starter-cache'\n implementation 'com.github.ben-manes.caffeine:caffeine'\n}\n✅ 二、启用缓存功能
在主类或配置类上添加 @EnableCaching 注解以启用缓存支持:
@SpringBootApplication\n@EnableCaching\npublic class Application {\n public static void main(String[] args) {\n SpringApplication.run(Application.class, args);\n }\n}\n✅ 三、配置 CaffeineCacheManager
创建一个配置类,定义缓存管理器并设置过期时间和最大条目数:
import org.springframework.cache.CacheManager;\nimport org.springframework.cache.annotation.EnableCaching;\nimport org.springframework.cache.caffeine.CaffeineCacheManager;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\nimport com.github.ben.manes.caffeine.cache.Caffeine;\n\nimport java.util.concurrent.TimeUnit;\n\n@Configuration\n@EnableCaching\npublic class CacheConfig {\n\n @Bean\n public CacheManager cacheManager() {\n CaffeineCacheManager cacheManager = new CaffeineCacheManager("userCache", "tokenCache");\n cacheManager.setCaffeine(Caffeine.newBuilder()\n .maximumSize(100) // 最大缓存条目数\n .expireAfterWrite(10, TimeUnit.MINUTES)); // 写入后10分钟过期\n return cacheManager;\n }\n}\n✅ 四、使用缓存注解
在业务逻辑中通过注解方式使用缓存,例如:
import org.springframework.cache.annotation.Cacheable;\nimport org.springframework.stereotype.Service;\n\n@Service\npublic class UserService {\n\n @Cacheable("userCache")\n public User getUserById(Long id) {\n // 模拟数据库查询\n System.out.println("Fetching user from DB...");\n return new User(id, "User" + id);\n }\n}\n其他常用注解包括:
| 注解 | 说明 |
|---|---|
@Cacheable | 根据方法参数缓存结果 |
@CachePut | 更新缓存 |
@CacheEvict | 清除缓存 |
✅ 五、动态调整缓存配置(可选)
你也可以将缓存配置抽取到 application.yml 中,实现更灵活的配置化管理:
caffeine:\n cache:\n userCache:\n maximum-size: 200\n expire-after-write: 30m\n tokenCache:\n maximum-size: 50\n expire-after-write: 1h\n然后通过自定义配置类解析这些值进行初始化。
🧩 示例:完整结构图
src/\n├── main/\n│ ├── java/\n│ │ └── com.example.demo/\n│ │ ├── Application.java\n│ │ ├── config/\n│ │ │ └── CacheConfig.java\n│ │ ├── service/\n│ │ │ └── UserService.java\n│ │ └── model/\n│ │ └── User.java\n│ └── resources/\n│ └── application.yml\n🔍 总结对比
| 功能 | 是否支持 | 备注 |
|---|---|---|
| 基于内存 | ✅ 是 | 本地缓存 |
| 线程安全 | ✅ 是 | 高并发友好 |
| TTL 过期机制 | ✅ 是 | 可配置写入/访问过期时间 |
| 最大条目限制 | ✅ 是 | 支持 LRU 淘汰策略 |
| Spring 集成支持 | ✅ 是 | 提供 CaffeineCacheManager |
| 分布式缓存 | ❌ 否 | 适合单机部署,如需分布式请用 Redis |
💡 小贴士
- 使用
@Cacheable(key = "#id")显式指定 key,避免因参数类型导致冲突。 - 可结合
@Scheduled定时任务做缓存预热或清理。 - 若项目中有多个缓存区域,建议统一在
CacheConfig中集中配置。