# spring-boot-starter-cache-plus **Repository Path**: xueyanjun/spring-boot-starter-cache-plus ## Basic Information - **Project Name**: spring-boot-starter-cache-plus - **Description**: 一个增强型的 Spring Boot 缓存启动器,简单易用,可扩展,可配置,可定制。该项目通过自定义注解和多种缓存策略,有效解决了缓存穿透、击穿和雪崩等常见问题。 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2025-09-05 - **Last Updated**: 2025-09-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Spring Boot Starter Cache Plus ## 项目介绍 Spring Boot Starter Cache Plus 是一个增强型的 Spring Boot 缓存启动器,简单易用,可扩展,可配置,可定制。该项目通过自定义注解和多种缓存策略,有效解决了缓存穿透、击穿和雪崩等常见问题。 ### 核心特性 1. **多级缓存支持**:同时支持本地缓存(Caffeine)和分布式缓存(Redis) 2. **自定义注解**:提供 [@CacheFindPlus]、[@CachePutPlus]、[@CacheEvictPlus] 等增强注解 3. **缓存策略**:内置多种缓存策略,包括互斥锁、逻辑过期、延迟双删等 4. **缓存监控**:集成 Micrometer,提供缓存命中率等监控指标 5. **BloomFilter 支持**:防止缓存穿透 6. **自动配置**:基于 Spring Boot 的自动配置机制,开箱即用 ## 模块结构 ``` spring-boot-starter-cache-plus ├── cache-plus-autoconfigure // 自动配置模块 ├── cache-plus-core // 核心功能模块 ├── cache-plus-local // 本地缓存实现(Caffeine) ├── cache-plus-redis // Redis 缓存实现 ├── cache-plus-monitor // 监控模块 ├── cache-plus-example // 示例项目 └── spring-boot-starter-cache-plus // Starter 模块 ``` ## 快速开始 ### 1. 添加依赖 在您的 Spring Boot 项目中添加以下依赖: ```xml xueyanjun-maven https://gitee.com/xueyanjun/maven.repository/raw/master io.gitee.xueyanjun spring-boot-starter-cache-plus 1.0.0 ``` ### 2. 启用缓存 在您的 Spring Boot 启动类上添加 [@EnableCachePlus] 注解: ```java @SpringBootApplication @EnableCachePlus public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` ### 3. 配置文件 在 `application.yml` 中配置缓存相关参数: ```yaml cache-plus: redis: enabled: true host: localhost port: 6379 local: enabled: true expire-after-write: 600 ``` ## 核心注解详解 ### [@CacheFindPlus] - 缓存查询 用于查询操作的缓存注解,支持多种高级特性: ```java @CacheFindPlus( value = "users", key = "#id", isLogicalTtl = true, // 启用逻辑过期 ttl = 300, // 过期时间300秒 randomRange = 60 // 随机过期范围60秒 ) public User getUserById(Long id) { // 数据库查询逻辑 return userRepository.findById(id); } ``` ### [@CachePutPlus] - 缓存更新 用于更新操作的缓存注解: ```java @CachePutPlus( value = "users", key = "#user.id", strategy = "delayDoubleDeleteStrategy" // 更新策略 ) public User saveUser(User user) { // 数据库保存逻辑 return userRepository.save(user); } ``` ### [@CacheEvictPlus]- 缓存清除 用于清除操作的缓存注解: ```java @CacheEvictPlus( value = "users", key = "#id" ) public void deleteUser(Long id) { // 数据库删除逻辑 userRepository.deleteById(id); } ``` ## 缓存策略 ### 缓存穿透解决方案 1. **BloomFilter**:通过布隆过滤器快速判断数据是否存在 2. **空值缓存**:对查询结果为空的请求也进行缓存,但设置较短的过期时间 ```java @CacheFindPlus( value = "users", key = "#id", bloomFilter = "userBloomFilter" // 指定BloomFilter ) public User getUserById(Long id) { // ... } ``` ### 缓存击穿解决方案 1. **互斥锁机制**:通过 指定缓存重建策略来解决 比如`strategy = findMissRedisMutexLockWriteStrategy` 参数启用 2. **逻辑过期时间**:通过 `isLogicalTtl = true` 参数启用 3. **策略模式**:可选择不同的缓存策略 ```java // 使用互斥锁防止击穿 @CacheFindPlus( cacheNames = "users", key = "#id", strategy = "findMissRedisMutexLockWriteStrategy", ttl = 300 ) public User getUserById(Long id) { // ... } // 使用逻辑过期防止击穿 @CacheFindPlus( cacheNames = "users", key = "#id", isLogicalTtl = true, ttl = 300 ) public User getUserById(Long id) { // ... } ``` ### 缓存雪崩解决方案 1. **随机过期时间**:通过 [randomRange] 参数设置随机过期时间范围 2. **多级缓存**:本地缓存 + 分布式缓存的架构 3. **差异化过期**:为不同类型的缓存设置不同的过期时间 ```java @CacheFindPlus( value = "users", key = "#id", ttl = 300, randomRange = 60 // 过期时间将在300-360秒之间随机 ) public User getUserById(Long id) { // ... } ``` ## 策略模式详解 ### 查询策略 | 策略类 | 描述 | 适用场景 | |-------|------|---------| | [FindMissJvmMutexLockWriteStrategy]| JVM级互斥锁 | 单体应用 | | [FindMissRedisMutexLockWriteStrategy]| Redis分布式锁 | 分布式应用 | | [FindMissDoNothingStrategy]| 不处理 | 可接受缓存穿透 | ### 更新策略 | 策略类 | 描述 | 适用场景 | |-------|------|---------| | [DelayDoubleDeleteStrategy] | 延迟双删 | 强一致性要求 | | [WriteThroughStrategy] | 写透模式 | 实时性要求高 | | [InvokeBeforeDeleteStrategy]| 先执行后删除 | 读多写少 | ## 配置说明 ### 完整配置示例 ```yaml cache-plus: redis: enabled: true # 是否启用Redis缓存 host: localhost # Redis主机 port: 6379 # Redis端口 password: # Redis密码(可选) database: 0 # Redis数据库索引 local: enabled: true # 是否启用本地缓存 expire-after-write: 600 # 本地缓存过期时间(秒) ``` ### 监控配置 ```yaml management: endpoints: web: exposure: include: "*" # 暴露所有监控端点 endpoint: health: show-details: always # 显示健康检查详情 ``` ## 使用示例 ### 基本用法 ```java @Service public class UserService { @CacheFindPlus( value = "users", key = "#id", ttl = 300 ) public User getUserById(Long id) { return userRepository.findById(id); } @CachePutPlus( value = "users", key = "#user.id" ) public User saveUser(User user) { return userRepository.save(user); } @CacheEvictPlus( value = "users", key = "#id" ) public void deleteUser(Long id) { userRepository.deleteById(id); } } ``` ### 高级用法 ```java @Service public class ProductService { // 防止缓存击穿 @CacheFindPlus( value = "products", key = "#id", isLogicalTtl = true, ttl = 600, strategy = "findMissRedisMutexLockWriteStrategy" ) public Product getProductById(Long id) { return productRepository.findById(id); } // 防止缓存雪崩 @CacheFindPlus( value = "productList", key = "#categoryId", ttl = 300, randomRange = 60 ) public List getProductsByCategory(Long categoryId) { return productRepository.findByCategoryId(categoryId); } // 使用布隆过滤器防止缓存穿透 @CacheFindPlus( value = "products", key = "#id", bloomFilter = "productBloomFilter" ) public Product getProductByIdWithBloomFilter(Long id) { return productRepository.findById(id); } } ``` ## 监控指标 项目集成了 Micrometer,提供以下监控指标: - `cache.hit`:缓存命中次数 - `cache.miss`:缓存未命中次数 - `cache.operation.time`:缓存操作耗时 可以通过 Prometheus、Grafana 等监控工具查看这些指标。 ## 性能优化建议 1. **合理设置TTL**:根据业务特点设置合适的过期时间 2. **使用多级缓存**:本地缓存 + 分布式缓存结合使用 3. **选择合适的策略**:根据业务场景选择合适的缓存策略 4. **监控缓存命中率**:定期检查缓存命中率,优化缓存配置 5. **防止大Key**:避免将大量数据存储在一个缓存Key中 ## 常见问题 ### 1. 缓存不生效 检查是否添加了 [@EnableCachePlus]注解,以及方法是否满足AOP代理要求(不能是private方法,不能在同一个类中调用等)。 ### 2. 缓存穿透 启用BloomFilter或对空值进行缓存: ```java @CacheFindPlus( value = "users", key = "#id", bloomFilter = "userBloomFilter" ) ``` ### 3. 缓存击穿 使用互斥锁或逻辑过期: ```java @CacheFindPlus( value = "users", key = "#id", isLogicalTtl = true // 或 使用互斥锁策略 ) ``` ### 4. 缓存雪崩 设置随机过期时间: ```java @CacheFindPlus( value = "users", key = "#id", ttl = 300, randomRange = 60 ) ``` ## 扩展开发 ```java // 自定义CacheFind注解上对应的缓存重建策略 public class CustomFindMissCacheStrategy implements CacheFindMissStrategy { // 实现自定义策略逻辑 } // 自定义CacheFind注解上对应的缓存重建策略 public class CustomPutCacheStrategy implements CachePutStrategy { // 实现自定义策略逻辑 } // 注册自定义策略 @Bean public CustomFindMissCacheStrategy customCacheStrategy1() { return new CustomFindMissCacheStrategy(); } @Bean public CustomPutCacheStrategy customCacheStrategy2() { return new CustomPutCacheStrategy(); } ```