美文网首页
2.1EhCache

2.1EhCache

作者: 孔垂云 | 来源:发表于2017-05-14 23:19 被阅读0次

    EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider,和Spring也能很好的整合到一起

    主要的特性有(来源于百度百科):

    1. 快速
    2. 简单
    3. 多种缓存策略
    4. 缓存数据有两级:内存和磁盘,因此无需担心容量问题
    5. 缓存数据会在虚拟机重启的过程中写入磁盘
    6. 可以通过RMI、可插入API等方式进行分布式缓存
    7. 具有缓存和缓存管理器的侦听接口
    8. 支持多缓存管理器实例,以及一个实例的多个缓存区域
    9. 提供Hibernate的缓存实现

    这里面有两个最主要,一个是在内存满后可以缓存至磁盘,另一个是多缓存区域。

    下面讲一下具体使用

    添加依赖

    <dependency>
         <groupId>net.sf.ehcache</groupId>
         <artifactId>ehcache</artifactId>
         <version>2.10.2</version>
     </dependency>
    

    ehcache.xml配置文件

    <?xml version="1.0" encoding="gbk"?>
    <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd">
        <diskStore path="java.io.tmpdir"/>
        <defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="30" timeToLiveSeconds="30" overflowToDisk="false"/>
        <!-- 
                配置自定义缓存
                maxElementsInMemory:缓存中允许创建的最大对象数
                eternal:缓存中对象是否为永久的,如果是,超时设置将被忽略,对象从不过期。
                timeToIdleSeconds:缓存数据的钝化时间,也就是在一个元素消亡之前,
                            两次访问时间的最大时间间隔值,这只能在元素不是永久驻留时有效,
                            如果该值是 0 就意味着元素可以停顿无穷长的时间。
                timeToLiveSeconds:缓存数据的生存时间,也就是一个元素从构建到消亡的最大时间间隔值,
                            这只能在元素不是永久驻留时有效,如果该值是0就意味着元素可以停顿无穷长的时间。
                overflowToDisk:内存不足时,是否启用磁盘缓存。
                memoryStoreEvictionPolicy:缓存满了之后的淘汰算法。
            -->
        <cache name="sysCache" 
            maxElementsInMemory="10"
            eternal="false"
            overflowToDisk="false" 
            timeToIdleSeconds="900" 
            timeToLiveSeconds="1800"
            memoryStoreEvictionPolicy="LFU" />
    </ehcache>
    

    这里是EhCache的配置文件,里面的注释写的非常清楚,最常用的几个属性也都写清楚含义了。

    EhCacheUtil工具类

    private static volatile EhCacheUtil ehCacheUtil;
        private static volatile CacheManager cacheManager;
        private static Logger log = LoggerFactory.getLogger(EhCacheUtil.class);
        private static String confPath = "/ehcache.xml";//定义配置文件路径
    
        public static EhCacheUtil getInstance() {
            if (null == ehCacheUtil) {
                synchronized (EhCacheUtil.class) {
                    if (null == ehCacheUtil) {
                        ehCacheUtil = new EhCacheUtil();
                    }
                }
            }
            return ehCacheUtil;
        }
    
        static {
            try {
                URL url = EhCacheUtil.class.getResource(confPath);
                cacheManager = CacheManager.create(url);
                log.info("ehcache初始化");
            } catch (Exception e) {
                e.printStackTrace();
                log.info("ehcache初始化失败");
            }
        }
    

    上面是利用单例模式初始化CacheManager

    static Cache getOrAddCache(String cacheName) {
            Cache cache = cacheManager.getCache(cacheName);
            if (cache == null) {
                synchronized (cacheManager) {
                    cache = cacheManager.getCache(cacheName);
                    if (cache == null) {
                        log.warn("Could not find cache config [" + cacheName + "], using default.");
                        cacheManager.addCacheIfAbsent(cacheName);
                        cache = cacheManager.getCache(cacheName);
                        log.info("Cache [" + cacheName + "] started.");
                    }
                }
            }
            return cache;
        }
    

    根据cache的区域获取对应的cache

     public static void put(String cacheName, Object key, Object value) {
            getOrAddCache(cacheName).put(new Element(key, value));
        }
    
        @SuppressWarnings("unchecked")
        public static <T> T get(String cacheName, Object key) {
            Element element = getOrAddCache(cacheName).get(key);
            return element != null ? (T) element.getObjectValue() : null;
        }
    
        @SuppressWarnings("rawtypes")
        public static List getKeys(String cacheName) {
            return getOrAddCache(cacheName).getKeys();
        }
    
        public static void remove(String cacheName, Object key) {
            getOrAddCache(cacheName).remove(key);
        }
    
        public static void removeAll(String cacheName) {
            getOrAddCache(cacheName).removeAll();
        }
    

    这几个方法就是把对象放入缓存,根据key来获取缓存,按照区域清空缓存。

    cache的使用

     public static void main(String[] args) {
            EhCacheUtil.put("sysCache", "cache", "Hello EhCache");
            String value = EhCacheUtil.get("sysCache", "cache");
            System.out.println(value);
        }
    

    初始化一个sysCache的区域,key是cache,value是Hello EhCache

    上面那个EhCacheUtil工具类可以直接用于实际开发,在实际开发中要配置自定义的缓存区域,这样就可以直接清理这个区域,而不用一个一个key的去删除。

    源码下载

    [本工程详细源码]
    (https://github.com/chykong/java_component/tree/master/chapter2_1_EhCache)

    相关文章

      网友评论

          本文标题:2.1EhCache

          本文链接:https://www.haomeiwen.com/subject/kexcxxtx.html