首页 > 其他分享 >配置和使用Ehcache

配置和使用Ehcache

时间:2023-06-07 20:33:14浏览次数:32  
标签:Ehcache ehcache cache 配置 Element 缓存 使用 属性

一、介绍 

  网上有很多关于Ehcache的介绍,这里就不在多说了,只需要知道Ehcache是一个缓存框架。缓存嘛,就是数据存取比硬盘快,但是容量小的存储区域。当我们需要频繁使用某些数据时,我们可以将这些数据放到缓存中,下次取数据的时候,直接从缓存中取,这样可以节省不少时间。如果我们自己手动进行缓存的管理将是比较棘手的的,因为这已经涉及到很多底层的技术了,但是Ehcache为我们做了封装,我们可以很方便地使用Ehcache来进行缓存的管理。

  Ehcache可以保存Element对象,这个Element对象本质上是一个key-value的键值对,其中key和value可以使是任意数据类型,这就代表可以用Ehcache来缓存任何类型的数据。

  下面将单独Ehcache的配置和使用方式,如果想要看Ehcache和Spring的整合,可以查看:

 

二、导入jar包

  我这里使用的是Ehcache2.10.6这个版本,虽然最新的Ehcache已经发布了3.7,根据情况选择版本;

  如果是Maven项目,可以在pom.xml中添加下面的依赖:

1 2 3 4 5 <dependency>     <groupId>net.sf.ehcache</groupId>     <artifactId>ehcache</artifactId>     <version>2.10.6</version> </dependency>

  我这里创建的是Java Web项目,所以使用手动导入jar包的方式创建项目。

 

三、XML方式配置Ehcache

  创建一个XML文件,文件名和保存路径随意(只要你能找到就行)。

  我这里是在项目的resources下创建一个ehcache.xml文件,内容如下,现在可以不用深究每一项配置的用途(其实看名称也能大概猜到用途):

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 <?xml version="1.0" encoding="UTF-8"?> <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">       <diskStore path="/home/ganlixin/tmp" />       <cache name="cacheOne"         maxBytesLocalDisk="5g" maxBytesLocalHeap="20m" maxBytesLocalOffHeap="200m"         maxEntriesLocalHeap="200" maxEntriesLocalDisk="300"         maxEntriesInCache="500" maxElementsInMemory="1000" eternal="false"         timeToIdleSeconds="60" timeToLiveSeconds="60" overflowToDisk="true"         memoryStoreEvictionPolicy="LRU">     </cache>       <cache name="cacheTwo"         maxBytesLocalDisk="5g" maxBytesLocalHeap="20m" maxBytesLocalOffHeap="200m"         maxEntriesLocalHeap="200" maxEntriesLocalDisk="300"         maxEntriesInCache="500" maxElementsInMemory="1000" eternal="false"         timeToIdleSeconds="60" timeToLiveSeconds="60" overflowToDisk="true"         memoryStoreEvictionPolicy="FIFO">     </cache> </ehcache>

  我们上面创建的ehcache.xml配置文件相当于配置了三个“桶”,名称分别是defaultCache、cacheOne、cacheTwo,每一个桶都是一个缓存区域,我们可以将数据放入桶中,实现了数据的缓存。

  我们可以创建多个ehcache配置文件,每一个配置文件可以理解为下面这张图。

  在缓存数据之前,我们可以自己选择读取哪个ehcache的配置文件(读取不同的配置文件,创建的缓存区域是不一样的),然后根据自己的需求,将数据放入我们指定的桶中。

  

 

四、测试使用Ehcache

  上面将ehcache配置好后,就可以进行测试了: 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 package cn.ganlixin.test;   import net.sf.ehcache.Cache; import net.sf.ehcache.CacheManager; import net.sf.ehcache.Element;   public class Demo {       public static void main(String[] args) {                   // 读取ehcache配置文件,创建cacheManager         CacheManager cacheManager = CacheManager.create("ehcache.xml");                   // 利用cacheManager获取指定的cache(相当于指定使用哪个桶来保存数据)         // 如果不指定的话,就会使用默认的defaultCache来存数据         Cache cache = cacheManager.getCache("cacheOne");           // 创建Element,Element是一个key-value形式的,key和value可以是任意数据类型         Element e = new Element("keyOne""valueOne");                   // 将Element放入我们指定的缓存中(也就是cacheOne那个桶中)         cache.put(e);           // 通过传入key值,从cache中获得Element         Element e2 = cache.get("keyOne");         System.out.println(e2);         // 获取的Element对象包含多个属性,打印的结果如下:         // [ key = keyOne, value=valueOne, version=1, hitCount=1, CreationTime = 1558015329449, LastAccessTime = 1558015329451 ]                   // 可以单独的获取Element属性         System.out.println(e2.getObjectKey());         System.out.println(e2.getObjectValue());         System.out.println(e2.getVersion());         System.out.println(e2.getHitCount());         System.out.println(e2.getCreationTime());         System.out.println(e2.getLastAccessTime());         System.out.println(e2.getExpirationTime());                   // 移除指定cache中的key对应的Element,移除成功则返回true,如果不存在或者Element已经过期,则返回false         // 注意移除不存在Element,并不会报错         boolean isRemoved = cache.remove("keyOne");                   // 替换         Element e3 = cache.replace(e2); // 返回替换前的Element,如果不存在则返回null         boolean isReplaced = cache.replace(e2, e3);                   // 关闭cacheManager         cacheManager.shutdown();     } }

  

五、Ehcache的数据存储

  对于Ehcache来说,缓存的数据可以保存自两个地方:内存和磁盘。其中数据存储内存是始终启用的,但是磁盘存储却并没有强制要求,可以自己配置。

  对于内存来说,还可以细分,Ehcache将内存分了两类:堆内存和非堆内存。 对于这两类,Ehcache官网是这样描述的:

The memory store is always enabled and exists in heap memory. For the best performance, allot as much heap memory as possible without triggering garbage collection (GC) pauses, and use the off-heap store to hold the data that cannot fit in heap (without causing GC pauses).

  翻译过来就是说:尽量扩大堆的容量(保证不会因为堆的容量不足而发生GC,导致停顿),并且尽量将不适合用堆来存储的数据放入非堆内存的区域进行存储。

 

 

六、配置文件解析

  Ehcache默认的是去项目的类路径(也就是classpath)目录下寻找ehcache.xml文件作为Ehcache的配置文件,但是我们也可以自己指定配置文件的名称和路径,只需要在创建CacheManager的时候保证自己写的路径没有错误即可。

  首先知道的是,Ehcache不仅支持我们在XML配置文件中对Ehcache进行配置,同时还支持我们在代码中进行Ehcache的配置(比如创建一个新的cache),但是,好像没有人会这样做,因为一旦将配置写在Java代码中,一旦要修改配置,就需要重新编译一次源码(甚至需要重新编译整个项目),而写在XML中就没有这个问题,只需要重新启动项目即可。

  我这里将ehcache.xml分为三部分,然后详细介绍每一部分。

6.1、CacheManager级别

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <?xml version="1.0" encoding="UTF-8"?> <ehcache     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"           maxEntriesLocalHeap="2000"     maxEntriesLocalOffHeap="2000"     maxEntriesLocalDisk="3000"           maxBytesLocalDisk="5g"     maxBytesLocalHeap="20m"     maxBytesLocalOffHeap="200m"           memoryStoreEvictionPolicy="LRU" > </ehcache>

  maxEntriesLocalHeap属性:在堆中,允许存放的Element最大数量值。

  maxEntriesLocalOffHeap属性:在堆外的内存中允许存放的Element的最大数量值。

  maxEntriesLocalDisk属性:在磁盘上允许存放的Element的最大数量值,如果设置为0,表示数量没有限制(可能会出现磁盘全部用尽的情况)。

  maxBytesLocalDisk属性:指定Ehcache可以在磁盘上占用的空间大小。

  maxBytesLocalHeap属性:制定Ehcache可以在堆内存中占用的空间大小。

  maxBytesLocalOffHeap属性:指定Ehcache可以在堆外的内存中占用多大的大小。

  memoryStoreEvictionPolicy属性:指定回收策略,可以选择:LRU、FIFO、LFU。

  上面的这几个属性不仅可以在CacheManager级别配置,还可以在<cache>配置。不过需要注意的是:如果CacheManager级别配置了maxBytesLocalDisk、maxBytesLocalHeap、maxBytesLocalOffHeap这几个属性,那么他下面的每个<cache>也必须配置这些属性,并且<cache>中配置的空间是从CacheManager中扣除的。

 

6.2、diskStore

1 2 3 4 5 6 7 <?xml version="1.0" encoding="UTF-8"?> <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">           <diskStore path="/home/ganlixin/tmp" />   </ehcache>

  <diskStore>可以用来配置是否启用磁盘存储,并指定保存的路径。如果启用磁盘存储的话,可以配置当内存中的Element超出限制时,将缓存中的数据写到磁盘中。

 

6.3、cache级别

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 <cache name="cacheOne"     maxBytesLocalDisk="5g"     maxBytesLocalHeap="20m"     maxBytesLocalOffHeap="200m"           maxEntriesLocalHeap="2000"     maxEntriesLocalDisk="3000"           maxEntriesInCache="500"     maxElementsInMemory="1000"           eternal="false"           timeToIdleSeconds="60"     timeToLiveSeconds="60"           overflowToDisk="true"     memoryStoreEvictionPolicy="LRU" >     <persistence strategy="localTempSwap"/> </cache>

  这一部分的很多属性都和CacheManager级别的属性相同,但是注意<cache>中不能出现MaxEntriesLocalOffHeap,也就是说不能配置堆外内存的大小。

  timeToIdleSeconds属性:元素放入cache后,距离上一次被访问的时间超过timeToIdleSeconds秒,元素就会被清除。如果设置为0,则表示距离上一次被访问的时间超过timeToIdleSeconds秒,元素也不会被清除。

  timeToLiveSeconds属性:距离该元素放入cache时间超过了timeToLiveSeconds秒,元素就会被清除,及时在此此件被访问过多次,依旧会被清除。如果设置为0,则表示即使距离放入元素的时间超过timeToLiveSeconds秒,元素也不会被清除。

  eternal属性:是否设置元素的生命周期为无限。如果设置为true,则表示即使超过设置的timeToIdleSeconds或者timeToLiveSeconds,元素也不会内清除(此时timeToIdleSeconds和timeToLiveSeconds相当于设置为0)。

  overflowToDisk属性:当内存中已经存放不下元素的时候(设置的内存大小不足),是否选择将元素保存到磁盘中。

  memoryStoreEvictionPolicy属性:cache中元素的回收策略。

  <persistence strategy="localTempSwap" /> 表示使用cache期间,会使用本地的磁盘交换空间,但是存在这上面的数据并不能真正持久化(一旦重启就消失了)。

标签:Ehcache,ehcache,cache,配置,Element,缓存,使用,属性
From: https://www.cnblogs.com/huigui-mint/p/17464475.html

相关文章

  • 使用 Dockerfile 自定义 Docker 镜像
    对于一些常用的Docker镜像,我们可以从Docker官方仓库或者国内的阿里云仓库中获取,比如mysql、redis、nginx等等。但是对于一些我们自己开发的程序,要想很方便的在Docker中部署,还是需要自己制作镜像。这里不介绍Docker常用命令的使用,网上学习资料很多,这里就直接进行演示。......
  • Vue 配置项props 使用方法
     props templatescript1 script2 ......
  • Python time strftime() 方法的使用
    1、描述strftime()用于格式化时间,返回以可读字符串表示的时间,格式自定义。2、说明python中日期和时间的格式化符号有很多,下面列举常用的符号: %y两位数的年份表示(00-99) %Y四位数的年份表示(000-9999) %m月份(01-12) %d月内中的一天(0-31) %H24小......
  • JDK没有JAVAX.ANNOTATION.JAR包解决方案,无法使用@RESOURCE解决方案
    高版本JDK无法使用@Resource注解解决方案1.普通项目下载javax.annotation-api-1.3.2.jar,并在lib目录中引入即可2.Maven项目Maven项目:在pom.xml中进行配置<dependency><groupId>javax.annotation</groupId><artifactId>jsr250-api</artifactId><ver......
  • mybatis generator 使用与 mybatis 与属性转换
    mybatisgeneratorMyBatisGenerator是MyBatis提供的一个代码生成工具。可以帮我们生成表对应的持久化对象(po)、操作数据库的接口(dao)、CRUDsql的xml(mapper)。MyBatisGenerator是一个独立工具,你可以下载它的jar包来运行、也可以在Ant和maven运行。引入相关依赖......
  • Python | assert的使用
    如果你在看python代码的时候,会在一些代码中看到assert关键字的语句。本文重点介绍Assert语句的作用以及什么时候应该使用该语句。什么是断言程序运行过程中,所有变量的当前值组合构成了“状态”;每执行一段程序,状态就发生变化;如果程序有逻辑错误的bug,必定在某处变量值的组合......
  • python @property、@setter、@deleter的介绍与使用
    @property是一个装饰器,使一个方法可以像属性一样被使用,而不需要在调用的时候带上()0x01@property使用我们通过一个简单的研发需求为背景,逐步解释各个装饰器的使用这里领导给了个需求,开发一个类,可以返回一个人的姓,名字以及全名,十分简单嘛classPerson():def__init__(se......
  • amazon linux ssh 使用密码登录
    amazonlinux ssh 使用密码登录1、使用AWS控制台创建的密钥对或者直接通过网页登录注意:使用pem私钥不允许直接登录root用户,只能登录默认用户例如:ec2-user,ubuntu等等2、创建root密码sudopasswdroot3、切换到root用户suroot4、修改sshd_config文件vim/etc/ssh/sshd_conf......
  • percona toolkit之pt-slave-restart使用
    介绍pt-slave-restart是一款mysql主从异常处理工具,监控replica端SQL_THREAD是否正常,如果异常pt-slave-restart尝试跳过导致错误的事务,然后重新启动SQL_THREAD已达到修复SQL_THREAD的目的。 测试MySQL主从复制source端mysql>select*fromt1;+----+-------+|id|name......
  • 拟合剩余使用寿命 (RUL) 估计的指数退化模型
    指数退化模型定义为                                         ......