springBoot整合Ehcache——工具类调用

  项目需求要缓存常用数据,整合Ehcache实现,结果@Cacheable注解怎么都不管用,网上找了很多资料各种试各种不行,无奈!只好写个工具类使用。

一、pom.xml配置

<dependency>
    <groupId>org.ehcache</groupId>
    <artifactId>ehcache</artifactId>
    <version>${ehcache.version}</version>
</dependency>
<dependency>
    <groupId>net.sf.ehcache</groupId>
    <artifactId>ehcache</artifactId>
</dependency>

二、ehcache.xml

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
         name="taxiEhcache" updateCheck="false">

    <!-- 磁盘缓存位置 -->
    <diskStore path="java.io.tmpdir"/>

    <!--
     缓存配置
       name:                            缓存名称。
       maxElementsInMemory:            缓存最大个数。
       eternal:                         对象是否永久有效,一但设置了,timeout将不起作用。
       timeToIdleSeconds:              设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。
       timeToLiveSeconds:              设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大。
       overflowToDisk:                 当内存中对象数量达到maxElementsInMemory时,Ehcache将会对象写到磁盘中。
       diskSpoolBufferSizeMB:          这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。
       maxElementsOnDisk:              硬盘最大缓存个数。
       diskPersistent:                 是否缓存虚拟机重启期数据 Whether the disk store persists between restarts of the Virtual Machine. The default value is false.
       diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。
       memoryStoreEvictionPolicy:      当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。
       clearOnFlush:                   内存数量最大时是否清除。
     -->
    <!-- 默认缓存 -->
    <defaultCache eternal="false"
                  maxElementsInMemory="1000"
                  overflowToDisk="false"
                  diskPersistent="false"
                  timeToIdleSeconds="0"
                  timeToLiveSeconds="600"
                  memoryStoreEvictionPolicy="LRU">
    </defaultCache>

    <cache name="taxiCache"
           maxEntriesLocalHeap="10000"
           eternal="false"
           timeToIdleSeconds="0"
           timeToLiveSeconds="0"
           overflowToDisk="false"
           statistics="true">
    </cache>

</ehcache>
    

三、编写工具类

public class EhCacheUtil {

    private static final Logger log = LoggerFactory.getLogger(EhCacheUtil.class);

    private static final String PATH = ClassUtils.getDefaultClassLoader().getResource("").getPath()+"ehcache/ehcache.xml";
    private CacheManager manager;
    private static EhCacheUtil ehCache;

    public static final String TAXI_CACHE = "taxiCache";
    public static final String GROUP_TREE_KEY = "groupTreeList";
    public static final String GROUP_VEHICLE_TREE_KEY = "groupVehicleTreeList";

    /**
     * 获得缓存配置管理
     * @param path
     */
    private EhCacheUtil(String path) {
        try {
            manager = CacheManager.create(path);
        } catch (Exception e) {
            e.printStackTrace();
            log.error("获取配置文件错误:{}",e.getMessage());
        }
    }

    /**
     * 初始化缓存管理类
     * @return
     */
    public static EhCacheUtil getInstance() {
        try {
            if (ehCache== null) {
                ehCache= new EhCacheUtil(PATH);
            }
        } catch (Exception e) {
            e.printStackTrace();
            log.error("初始化错误:{}",e.getMessage());
        }
        return ehCache;
    }

    /**
     * 获取Cache类
     * @param cacheName
     * @return
     */
    public Cache getCache(String cacheName) {
        return manager.getCache(cacheName);
    }

    /**
     * 添加缓存数据
     * @param cacheName
     * @param key
     * @param value
     */
    public void put(String cacheName, String key, Object value) {
        try {
            Cache cache = manager.getCache(cacheName);
            Element element = new Element(key, value);
            cache.put(element);
        } catch (Exception e) {
            e.printStackTrace();
            log.error("添加缓存失败:{}",e.getMessage());
        }
    }

    /**
     * 获取缓存数据
     * @param cacheName
     * @param key
     * @return
     */
    public Object get(String cacheName, String key) {
        try {
            Cache cache = manager.getCache(cacheName);
            Element element = cache.get(key);
            return element == null ? null : element.getObjectValue();
        } catch (Exception e) {
            e.printStackTrace();
            log.error("获取缓存数据失败:{}",e.getMessage());
            return null;
        }
    }

    /**
     * 删除缓存数据
     * @param cacheName
     * @param key
     */
    public void delete(String cacheName, String key) {
        try {
            Cache cache = manager.getCache(cacheName);
            cache.remove(key);
        } catch (Exception e) {
            e.printStackTrace();
            log.error("删除缓存数据失败:{}",e.getMessage());
        }
    }
}

四、调用

1、存数据

EhCacheUtil ehCacheUtil = EhCacheUtil.getInstance();
ehCacheUtil.put(ehCacheUtil.TAXI_CACHE,ehCacheUtil.GROUP_VEHICLE_TREE_KEY,ztrees);

2、取数据

ztrees = (List<Ztree>) ehCacheUtil.get(ehCacheUtil.TAXI_CACHE,ehCacheUtil.GROUP_VEHICLE_TREE_KEY);

3、删除缓存

ehCacheUtil.delete(ehCacheUtil.TAXI_CACHE,ehCacheUtil.GROUP_TREE_KEY);

 

posted @ 2019-06-26 17:00  KitFung-P  阅读(3217)  评论(0编辑  收藏  举报