spring boot 整合 ehcache 2020-08-06 程序之旅,记录 2 条评论 1425 次阅读 ## spring boot 整合 ehcache 目前java的缓存框架有很多,比如:Ehcache、Cacheonix、JBoss Cache、OSCache、Memcached和Redis等,这里就单独列出EhCache、memcached和Redis来进行比较,并实现EhCache。 ### 比较常用的缓存框架 | | redis | memcached | ehcache | | ---------- | ---------- | --------- | ---------- | | 开发难易 | 适中 | 简单 | 快速、简单 | | 分布式支持 | 支持 | 支持 | 不完善 | | 过期设置 | 支持 | 支持 | 支持 | | 持久化 | 支持 | 不支持 | 支持 | | 缓存速度 | 高 | 高 | 很高 | | spring兼容 | 兼容性好 | 一般 | 兼容性好 | | github | | | | | 使用方式 | socket | socket | jvm | | 数据结构 | 多数据结构 | string | 多数据结构 | 各框架应用场景: - ehcache直接在jvm虚拟机中缓存,速度快,效率高;但是缓存共享麻烦,集群分布式应用不方便。 - redis是通过socket访问到缓存服务,效率比ecache低,比数据库要快很多,处理集群和分布式缓存方便,有成熟的方案。 - memcached给予内存的key-value的存储,简洁强大,适合大型的分布式系统,但不能数据持久化 > 在Ehcache中对于缓存的存储主要有三种方式:分别是堆内存、非堆内存和磁盘。其中非堆内存是针对于企业版Ehcache才有的功能,它可以不受Java GC的影响,能够创建很大的缓存。 ### spring boot 整合 echcache 第一步:pom.xml 依赖 ```xml org.springframework.boot spring-boot-starter-cache net.sf.ehcache ehcache ``` 第二步:在resources文件夹中创建ehcache.xml配置文件 ```xml ``` 参数说明 - maxElementsInMemory:设置了缓存的上限,最多存储多少个记录对象。若放入Cache中的元素超过这个数值,则有以下两种情况 1)若overflowToDisk=true,则会将Cache中多出的元素放入磁盘文件中 2)若overflowToDisk=false,则根据memoryStoreEvictionPolicy策略替换Cache中原有的元素 - eternal:代表对象是否永不过期 (指定true则下面两项配置需为0无限期) - timeToIdleSeconds:当对象自从被存放到缓存中后,如果处于缓存中的时间超过了 timeToLiveSeconds属性值,这个对象就会过期,EHCache将把它从缓存中清除;即缓存自创建日期起能够存活的最长时间,单位为秒(s) - timeToLiveSeconds:当对象自从最近一次被访问后,如果处于空闲状态的时间超过了timeToIdleSeconds属性值,这个对象就会过期,EHCache将把它从缓存中清空;即缓存被创建后,最后一次访问时间到缓存失效之时,两者之间的间隔,单位为秒(s) - overflowToDisk:是否允许对象被写入到磁盘 - maxElementsOnDisk : 磁盘缓存中最多可以存放的元素数量,0表示无穷大 - diskExpiryThreadIntervalSeconds:磁盘缓存的清理线程运行间隔,默认是120秒 - memoryStoreEvictionPolicy:内存存储与释放策略,即达到maxElementsInMemory限制时,Ehcache会根据指定策略清理内存 共有三种策略,分别为LRU(最近最少使用)、LFU(最常用的)、FIFO(先进先出) 第三步:spring boot 配置文件`application.properties`(application.yml)中加入配置项 ```properties spring.cache.ehcache.config=classpath:ehcache.xml 或 spring: cache: ehcache: config: classpath:ehcache.xml type: ehcache ``` 第四步:spring boot开启缓存机制 在启动类上加入`@EnableCaching`,启动类启动时会去启动缓存启动器。 第五步:简单使用 ```java @Override @Cacheable(value = "userCache", key = "#id") public Integer saveCache(Integer id) { return id; } @Override @Cacheable(value = "userCache", key = "#id") public Integer selectCache(Integer id) { return null; } ``` userCache是ehcache.xml配置文件中的策略名,如果没有填写,则使用默认缓存策略。 #### @Cacheable使用 有几个属性:key、value、condition, key:缓存对应的数据的主键 value:策略名称,对应的是配置ehcache.xml中的,cache名 其中condition中使用的是SPEL语句 #### @CachePut使用 配置于函数上,能够根据参数定义条件来进行缓存,它与`@Cacheable`不同的是,它每次都会真是调用函数,所以主要用于数据新增和修改操作上。它的参数与`@Cacheable`类似,具体功能可参考上面对`@Cacheable`参数的解析 #### @CacheEvict使用 标注在需要清除缓存元素的方法或类上,清除缓存,同样有key、value和condition属性 ### 封装ehcache工具类 ```java package com.newgrand.real.name.management.util; import net.sf.ehcache.Cache; import net.sf.ehcache.CacheManager; import net.sf.ehcache.Element; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; import java.util.List; /** * 类 名:com.newgrand.real.name.management.util.EhcacheUtil * 类描述:ehcache工具类 * 创建人:liurui * 创建时间:2020/8/5 14:59 * 修改人: * 修改时间: * 修改备注: * * @author liurui * @version 1.0 */ @Component public class EhcacheUtil { @Autowired @Lazy private CacheManager cacheManager; public final static String PASS_CACHE = "passCache"; /** * 缓存数据 * @Author liurui * @Description 缓存字符串 * @Date 16:00 2020/8/5 * @param cacheName * @param key * @param value * @return void **/ public void set(String cacheName, String key, Object value) { Cache cache = cacheManager.getCache(cacheName); Element element = new Element( key, value); cache.put(element); } /** * 获取缓存内容 * @Author liurui * @Description 获取缓存内容 * @Date 16:01 2020/8/5 * @param cacheName * @param key * @return java.lang.Object **/ public Object get(String cacheName, String key) { Cache cache = cacheManager.getCache(cacheName); Element element = cache.get(key); if(element == null){ return null; } return element.getObjectValue(); } /** * 获取指定策略模式的所有主键 * @Author liurui * @Description 获取指定策略模式的所有主键 * @Date 16:02 2020/8/5 * @param cacheName * @return java.util.List **/ public List getKeys(String cacheName) { Cache cache = cacheManager.getCache(cacheName); return cache.getKeys(); } } ``` 打赏: 微信, 支付宝 标签: java, spring boot, 缓存 本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
%E7%9C%8B%E7%9D%80%E4%BD%A0%E7%9A%84%E4%BB%A3%E7%A0%81%E5%BE%88%E8%88%92%E6%9C%8D%EF%BC%8C%E5%92%8C%E4%BA%BA%E4%B8%80%E6%A0%B7
%E5%88%AB%E6%9D%A5%E6%97%A0%E6%81%99