1.Ehcache介绍Ehcache是一个用Java实现的简单、高速、线程安全的缓存管理类库。具体快速、简单、低消耗、依赖性小、扩展性强、支持对象或序列化缓存、支持缓存或元素的失效、提供LRU/LFU/FIFO缓存策略、支持内存缓存及磁盘缓存、采用分布式缓存机制等特点。 2.引入依赖在项目的pom.xml中添加下面这三个依赖: dependency> groupId>javax.cachegroupId> artifactId>cache-apiartifactId>dependency>dependency> groupId>org.ehcachegroupId> artifactId>ehcacheartifactId> version>3.7.0version>dependency>dependency> groupId>org.springframework.bootgroupId> artifactId>spring-boot-starter-cacheartifactId>dependency>
3.配置属性3.1 配置application.properties在application.properties添加如下配置:
3.2配置ehcache-3.x.xml在resources文件夹下新建ehcache-3.x.xml,添加如下内容: eh:config xmlns:xsi='http://www./2001/XMLSchema-instance' xmlns:eh='http://www./v3' xsi:schemaLocation='http://www./v3 http://www./schema/ehcache-core-3.3.xsd'> eh:persistence directory='${java.io.tmpdir}/cache-data'/> eh:cache-template name='default'> eh:expiry> eh:ttl unit='seconds'>600eh:ttl> eh:expiry> eh:resources> eh:heap unit='entries'>2000eh:heap> eh:offheap unit='MB'>100eh:offheap> eh:resources> eh:cache-template> eh:cache alias='sample' uses-template='default'>eh:cache> eh:cache alias='authority_service' uses-template='default'> eh:expiry> eh:ttl unit='hours'>1eh:ttl> eh:expiry> eh:cache> eh:cache alias='shop_service' uses-template='default'> eh:expiry> eh:ttl unit='hours'>24eh:ttl> eh:expiry> eh:cache>eh:config> 更多配置知识,请参考ehcache官网:ehcache XML配置 4.使用示例4.1 准备一个controller该controller只有一个方法,获得某类商品的列表:
4.2 准备一个service
注意: 1和2配合起来才能使某个bean的某个方法具有缓存的功能。 package com.example.demo.service;import org.springframework.cache.annotation.Cacheable;import org.springframework.cache.annotation.EnableCaching;import org.springframework.stereotype.Service;import java.util.ArrayList;import java.util.List;@Service@EnableCachingpublic class ShopService { // value:使用叫做'shop_service'的缓存器 // key: 缓存的key等于#type,即传入的key值 // condition:缓存的条件,当#type等于phone时,才进行缓存 @Cacheable(cacheNames = 'shop_service', key = '#type', condition = '#type == 'phone'') public List 4.3 启动springBoot,进行测试使用浏览器,发送4个请求:
后台打印的日志如下:
4.4 结果分析第一次发送请求,符合缓存的条件,由于没有缓存,于是执行了service的逻辑,并将结果缓存到了ehcache中。 5.Ehcache使用场景使用的过程中,根据优点和缺点进行权衡后再应用到项目中去,Ehcache缓存也是如此,在实际工作有很多使用场景,通常将Ehcache作为Redis的二次缓存使用。 5.1 Ehcache的适用场景(1) 比较少的更新数据表的情况下 5.2Ehcache的缺陷(1) 缓存漂移 5.3 Ehcache的正确打开方式我们在项目中使用集中式缓存(Redis或Memcached等)通常都是检查缓存中是否存在期望的数据,如果存在直接将数据返回,如果不存在就查询数据库然后再将数据缓存,而后将结果返回。这时候如果缓存系统因为某些原因宕机,造成服务无法访问,那么大量的请求将直接穿透到数据库,对数据库造成巨大的压力。 针对上述情况,我们有多种可行的解决方法,其中一种方案是将Ehcache作为集中式缓存的二级本地缓存,这样当缓存系统宕机后,服务器应用的本地缓存还能继续抗住大量请求。 使用了Ehcache作为本地缓存后,可能会出现本地缓存与缓存系统之间出现数据不一致的情况,因为本地缓存是在服务器应用中存在,在实际生产环境中必定是多台服务器分别部署,如何能够在更新缓存系统数据的同时,也能够更新Ehcache的缓存数据,以及保证不同服务器间Ehcache本地缓存数据的同步问题。 一般有两种解决方案可供参考: 针对上述的分析,可形成如下的缓存方案: 缓存方案.jpg |
|