在 Spring Boot 中集成 Caffeine 缓存

ppylox
·7/12/2025·0 阅读
AI 摘要模型根据正文自动生成,仅供参考

本文介绍在Spring Boot中集成Caffeine本地缓存:添加spring-boot-starter-cache与caffeine依赖,用@EnableCaching启用缓存,通过CaffeineCacheManager配置最大条目数与写入过期时间,并用@Cacheable、@CachePut、@CacheEvict注解管理缓存。支持将配置抽取到application.yml实现动态调整。Caffeine线程安全、支持TTL与LRU淘汰,适合单机部署,分布式场景需改用Redis。

在 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>\n

Gradle:

// 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 中集中配置。


相关文章

评论 (0)

暂无评论,来写第一条吧