• 缓存之ehcache


    1.EhCache缓存框架简介

    EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。

    我们使用EhCache缓存框架主要是为了判断重复Url,每次爬取一个网页,都把Url存储到缓存中,并且每次爬某个网页之前,都去缓存中搜索下,假如存在的话,我们就不要爬取这个网页了,不存在的话,我们就爬下网页,爬取成功后,把这个Url存储到缓存中;之所以用缓存框架,主要是速度快,相对于传统数据库;

    Ehcache是一种广泛使用的开源Java分布式缓存。主要面向通用缓存,Java EE和轻量级容器。它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个gzip缓存servlet过滤器,支持REST和SOAP api等特点。

    Ehcache最初是由Greg Luck于2003年开始开发。2009年,该项目被Terracotta购买。软件仍然是开源,但一些新的主要功能(例如,快速可重启性之间的一致性的)只能在商业产品中使用,例如Enterprise EHCache and BigMemory。维基媒体Foundationannounced目前使用的就是Ehcache技术。

    主要的特性有:

    1. 快速

    2. 简单

    3. 多种缓存策略

    4. 缓存数据有两级:内存和磁盘,因此无需担心容量问题

    5. 缓存数据会在虚拟机重启的过程中写入磁盘

    6. 可以通过RMI、可插入API等方式进行分布式缓存

    7. 具有缓存和缓存管理器的侦听接口

    8. 支持多缓存管理器实例,以及一个实例的多个缓存区域

    9. 提供Hibernate的缓存实现

     2.EhCache HelloWorld实现

    EhCache最新版本是3.X 本人一直用的是2.X 比较稳定 功能足够用;

    所以还是用2.X版本;

    我们新建一个Maven项目,

    pom.xml里引入 ehcache支持;

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

      ehcache.xml配置文件

    <?xml version="1.0" encoding="UTF-8"?>
     
    <ehcache>
       <!-- 
             磁盘存储:将缓存中暂时不使用的对象,转移到硬盘,类似于Windows系统的虚拟内存
              path:指定在硬盘上存储对象的路径
       -->
       <diskStore path="C:ehcache" />
        
       <!-- 
            defaultCache:默认的缓存配置信息,如果不加特殊说明,则所有对象按照此配置项处理
            maxElementsInMemory:设置了缓存的上限,最多存储多少个记录对象
            eternal:代表对象是否永不过期
            overflowToDisk:当内存中Element数量达到maxElementsInMemory时,Ehcache将会Element写到磁盘中
       -->
       <defaultCache
          maxElementsInMemory="100"
          eternal="true"
          overflowToDisk="true"/>
     
         
        <cache 
          name="a"
          maxElementsInMemory="100"
          eternal="true"
          overflowToDisk="true"/>
     
    </ehcache>
    

      我们再新建一个测试类:

    package com.open1111;
     
    import net.sf.ehcache.Cache;
    import net.sf.ehcache.CacheManager;
    import net.sf.ehcache.Element;
     
    public class EhcacheTest {
     
        public static void main(String[] args) {
            // 根据ehcache.xml配置文件创建Cache管理器
            CacheManager manager=CacheManager.create("./src/main/resources/ehcache.xml");
            Cache c=manager.getCache("a"); // 获取指定Cache
            Element e=new Element("java1234","屌"); // 实例化一个元素
            c.put(e); // 把一个元素添加到Cache中
             
            Element e2=c.get("java1234"); // 根据Key获取缓存元素
            System.out.println(e2);
            System.out.println(e2.getObjectValue());
             
            c.flush(); // 刷新缓存
            manager.shutdown(); // 关闭缓存管理器
        }
    }
    

      3.EhCache 常用配置项详解

    EhCache 给我们提供了丰富的配置来配置缓存的设置;

    这里列出一些常见的配置项:

    cache元素的属性:  

        name:缓存名称  

        maxElementsInMemory:内存中最大缓存对象数  

        maxElementsOnDisk:硬盘中最大缓存对象数,若是0表示无穷大  

        eternal:true表示对象永不过期,此时会忽略timeToIdleSeconds和timeToLiveSeconds属性,默认为false  

        overflowToDisk:true表示当内存缓存的对象数目达到了maxElementsInMemory界限后,会把溢出的对象写到硬盘缓存中。注意:如果缓存的对象要写入到硬盘中的话,则该对象必须实现了Serializable接口才行。  

        diskSpoolBufferSizeMB:磁盘缓存区大小,默认为30MB。每个Cache都应该有自己的一个缓存区。  

        diskPersistent:是否缓存虚拟机重启期数据  

        diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认为120秒  

        timeToIdleSeconds: 设定允许对象处于空闲状态的最长时间,以秒为单位。当对象自从最近一次被访问后,如果处于空闲状态的时间超过了timeToIdleSeconds属性值,这个对象就会过期,EHCache将把它从缓存中清空。只有当eternal属性为false,该属性才有效。如果该属性值为0,则表示对象可以无限期地处于空闲状态  

        timeToLiveSeconds:设定对象允许存在于缓存中的最长时间,以秒为单位。当对象自从被存放到缓存中后,如果处于缓存中的时间超过了 timeToLiveSeconds属性值,这个对象就会过期,EHCache将把它从缓存中清除。只有当eternal属性为false,该属性才有效。如果该属性值为0,则表示对象可以无限期地存在于缓存中。timeToLiveSeconds必须大于timeToIdleSeconds属性,才有意义  

        memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。可选策略有:LRU(最近最少使用,默认策略)、FIFO(先进先出)、LFU(最少访问次数)。  

    4.Ehcache配置持久化到硬盘

    Ehcache默认配置的话 为了提高效率,所以有一部分缓存是在内存中,然后达到配置的内存对象总量,则才根据策略持久化到硬盘中,这里是有一个问题的,假如系统突然中断运行 那内存中的那些缓存,直接被释放掉了,不能持久化到硬盘;这种数据丢失,对于一般项目是不会有影响的,但是对于我们的爬虫系统,我们是用来判断重复Url的,所以数据不能丢失;

    这时候我们就需要通过Ehcache配置,来实现缓存的持久化,不存内存中。

    这里给下参考配置:

    <?xml version="1.0" encoding="UTF-8"?>
     
    <ehcache>
       <!-- 
             磁盘存储:将缓存中暂时不使用的对象,转移到硬盘,类似于Windows系统的虚拟内存
              path:指定在硬盘上存储对象的路径
       -->
       <diskStore path="C:ehcache" />
        
       <!-- 
            defaultCache:默认的缓存配置信息,如果不加特殊说明,则所有对象按照此配置项处理
            maxElementsInMemory:设置了缓存的上限,最多存储多少个记录对象
            eternal:代表对象是否永不过期
            overflowToDisk:当内存中Element数量达到maxElementsInMemory时,Ehcache将会Element写到磁盘中
       -->
       <defaultCache
          maxElementsInMemory="100"
          eternal="true"
          overflowToDisk="true"/>
     
        <!-- 
            maxElementsInMemory设置成1,overflowToDisk设置成true,只要有一个缓存元素,就直接存到硬盘上去
            eternal设置成true,代表对象永久有效
            maxElementsOnDisk设置成0 表示硬盘中最大缓存对象数无限大
            diskPersistent设置成true表示缓存虚拟机重启期数据 
         -->
        <cache 
          name="a"
          maxElementsInMemory="1" 
          eternal="true"
          overflowToDisk="true" 
          maxElementsOnDisk="0"
          diskPersistent="true"/>
     
    </ehcache>
    

      

    运行前面的测试代码,只要我们添加缓存元素 ,则直接写入到硬盘中;

    QQ鎴�浘20170405105247.jpg

  • 相关阅读:
    解决ScrollView嵌到listView冲突问题
    Popupwindow 的简单实用,(显示在控件下方)
    BroadCast,BroadCastReceiver
    NSURLSession
    sirikit
    MJExtension使用
    iOS中的translucent和automaticallyAdjustsScrollViewInsets用法
    如何获取LanuchImage-1(详细)
    如何获取LanuchImage
    MJRefresh详解
  • 原文地址:https://www.cnblogs.com/zhangyongJava/p/8315572.html
Copyright © 2020-2023  润新知