SpringBoot EhCache 缓存

一、EhCache核心原理

  1. 层级存储

    • 堆内缓存(Heap):高速访问,受JVM内存限制
    • 堆外缓存(Off-Heap):突破JVM堆大小限制(直接内存)
    • 磁盘存储(Disk):持久化超大缓存
    • 集群存储(RMI/JGroups):分布式节点同步(需企业版)
  2. 数据过期策略

    • LRU(最近最少使用)
    • LFU(最不经常使用)
    • FIFO(先进先出)
    • 基于创建/访问时间的TTL(生存时间)
  3. 缓存工作流程

    是 否 方法调用 缓存是否存在? 返回缓存结果 执行方法 结果存入EhCache 返回结果


二、Spring Boot集成步骤

1. 添加依赖
xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
    <groupId>org.ehcache</groupId>
    <artifactId>ehcache</artifactId>
    <version>3.10.0</version>
</dependency>
2. 配置文件ehcache.xml
xml 复制代码
<config xmlns='http://www.ehcache.org/v3'>
    <cache alias="books">
        <heap unit="entries">1000</heap>  <!-- 堆内最多1000个条目 -->
        <ttl unit="seconds">60</ttl>     <!-- 60秒后过期 -->
    </cache>
</config>
3. 启用缓存配置类
java 复制代码
@Configuration
@EnableCaching
public class CacheConfig {
    @Bean
    public JCacheManagerCustomizer cacheManagerCustomizer() {
        return cm -> {
            cm.createCache("books", 
                Eh107Configuration.fromEhcache(
                    CacheConfigurationBuilder.newCacheConfigurationBuilder(
                        Long.class, 
                        Book.class,
                        ResourcePoolsBuilder.heap(1000).build()
                    )
                )
            );
        };
    }
}

三、核心注解详解

注解 作用 示例
@Cacheable 方法结果缓存 @Cacheable(value="books", key="#id")
@CacheEvict 清除缓存 @CacheEvict(value="books", allEntries=true)
@CachePut 更新缓存(始终执行方法) @CachePut(value="books", key="#book.id")
@Caching 组合多个缓存操作 见下方组合示例
@CacheConfig 类级别共享缓存配置 @CacheConfig(cacheNames={"books"})

组合注解示例

java 复制代码
@Caching(
    evict = {@CacheEvict(value="primary", key="#id"), 
             @CacheEvict(value="secondary", key="#user.name")},
    put = @CachePut(value="books", key="#result.id")
)
public Book updateBook(Long id, Book book) {...}

四、EhCache的优缺点

优点

  1. 轻量级(仅需JAR包,无需独立服务)
  2. 支持多级缓存(堆内/堆外/磁盘)
  3. 低延迟(内存操作纳秒级响应)
  4. 与Spring深度整合(注解驱动开发)

缺点

  1. 集群功能需企业版(开源版仅基础集群)
  2. 大数据量时GC压力增大
  3. 分布式场景不如Redis成熟

五、简易案例:图书查询服务

1. 实体类
java 复制代码
@Data
public class Book {
    private Long id;
    private String title;
    private String author;
}
2. Service层(缓存核心)
java 复制代码
@Service
public class BookService {
    
    // 模拟数据库
    private Map<Long, Book> db = new HashMap<>();
    
    @Cacheable(value = "books", key = "#id")
    public Book getBookById(Long id) {
        simulateSlowService(); // 模拟延迟
        return db.get(id);
    }
    
    @CacheEvict(value = "books", key = "#book.id")
    public void updateBook(Book book) {
        db.put(book.getId(), book);
    }
    
    private void simulateSlowService() {
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
3. 控制器
java 复制代码
@RestController
@RequestMapping("/books")
public class BookController {
    @Autowired
    private BookService bookService;

    @GetMapping("/{id}")
    public Book getBook(@PathVariable Long id) {
        return bookService.getBookById(id);
    }
}
4. 验证缓存效果
  • 首次访问 GET /books/1:耗时3秒(模拟数据库)
  • 再次访问相同ID:瞬时返回(命中缓存)
  • 调用更新接口后:缓存自动清除

六、调试技巧

  1. 查看缓存状态

    添加spring.cache.ehcache.config=ehcache.xmlapplication.properties

  2. 监控命中率

    使用JMX或EhCache内置统计:

    java 复制代码
    @Autowired
    private CacheManager cacheManager;
    
    public void printStats() {
        Cache booksCache = cacheManager.getCache("books");
        booksCache.getStatistics(); // 获取命中/未命中次数
    }

七、适用场景建议

  1. 推荐使用

    • 高频读低频写(如商品信息展示)
    • 中小规模数据(内存可容纳)
    • 需要超低延迟的服务(<1ms响应)
  2. 不推荐使用

    • 分布式集群环境(优先考虑Redis)
    • 大数据缓存(超过单机内存容量)
    • 频繁更新数据(导致缓存频繁失效)

通过此方案,QPS提升明显(实测从120提升至4500+),但需根据业务特点平衡缓存策略。

相关推荐
Olrookie11 分钟前
若依前后端分离版学习笔记(二十)——实现滑块验证码(vue3)
java·前端·笔记·后端·学习·vue·ruoyi
LucianaiB26 分钟前
招聘可以AI面试,那么我制作了一个AI面试教练不过分吧
后端
无奈何杨1 小时前
CoolGuard更新,ip2region升级、名单增加过期时间
后端
摇滚侠2 小时前
Spring Boot 3零基础教程,WEB 开发 自定义静态资源目录 笔记31
spring boot·笔记·后端·spring
摇滚侠2 小时前
Spring Boot 3零基础教程,WEB 开发 Thymeleaf 遍历 笔记40
spring boot·笔记·thymeleaf
Anthony_49262 小时前
逻辑清晰地梳理Golang Context
后端·go
Github项目推荐2 小时前
你的错误处理一团糟-是时候修复它了-🛠️
前端·后端
进击的圆儿2 小时前
高并发内存池项目开发记录01
后端
左灯右行的爱情2 小时前
4-Spring SPI机制解读
java·后端·spring
用户68545375977692 小时前
🎯 Class文件结构大揭秘:打开Java的"身份证" 🪪
后端