一:Ehcache简介
1、Ehcache是一种广泛使用的开源Java分布式缓存。主要面向通用缓存,Java EE和轻量级容器。它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个gzip缓存servlet过滤器,支持REST和SOAP api等特点。
2、尤其互联网项目需要处理一些大数据、高并发、高性能需要用到缓存等。
二:Ehcache需要jar包
注意:log4j是Ehcache的依赖包,必须导入的。
三:再src目录下新建ehcache.xml文件
1、
2、内容如下
<?xml version="1.0" encoding="UTF-8"?> <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"> <!-- 默认缓存 --> <defaultCache maxElementsInMemory="1000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="false"/> <!-- 指定名字缓存 --> <cache name="studyCache" maxElementsInMemory="1000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true" memoryStoreEvictionPolicy="LRU"/> </ehcache>
3、Ehcache参数说明
<diskStore>:当内存缓存中对象数量超过maxElementsInMemory时,将缓存对象写到磁盘缓存中(需对象实现序列化接口)。
<diskStore path="">:用来配置磁盘缓存使用的物理路径,Ehcache磁盘缓存使用的文件后缀名是*.data和*.index。
name:缓存名称,cache的唯一标识(ehcache会把这个cache放到HashMap里)。
maxElementsOnDisk:磁盘缓存中最多可以存放的元素数量,0表示无穷大。
maxElementsInMemory:内存缓存中最多可以存放的元素数量,若放入Cache中的元素超过这个数值,则有以下两种情况。
1)若overflowToDisk=true,则会将Cache中多出的元素放入磁盘文件中。
2)若overflowToDisk=false,则根据memoryStoreEvictionPolicy策略替换Cache中原有的元素。
Eternal:缓存中对象是否永久有效,即是否永驻内存,true时将忽略timeToIdleSeconds和timeToLiveSeconds。
timeToIdleSeconds:缓存数据在失效前的允许闲置时间(单位:秒),仅当eternal=false时使用,默认值是0表示可闲置时间无穷大,此为可选属性即访问这个cache中元素的最大间隔时间,若超过这个时间没有访问此Cache中的某个元素,那么此元素将被从Cache中清除。
timeToLiveSeconds:缓存数据在失效前的允许存活时间(单位:秒),仅当eternal=false时使用,默认值是0表示可存活时间无穷大,即Cache中的某元素从创建到清楚的生存时间,也就是说从创建开始计时,当超过这个时间时,此元素将从Cache中清除。
overflowToDisk:内存不足时,是否启用磁盘缓存(即内存中对象数量达到maxElementsInMemory时,Ehcache会将对象写到磁盘中),会根据标签中path值查找对应的属性值,写入磁盘的文件会放在path文件夹下,文件的名称是cache的名称,后缀名是data。
diskPersistent:是否持久化磁盘缓存,当这个属性的值为true时,系统在初始化时会在磁盘中查找文件名为cache名称,后缀名为index的文件,这个文件中存放了已经持久化在磁盘中的cache的index,找到后会把cache加载到内存,要想把cache真正持久化到磁盘,写程序时注意执行net.sf.ehcache.Cache.put(Element element)后要调用flush方法。
diskExpiryThreadIntervalSeconds:磁盘缓存的清理线程运行间隔,默认是120秒。
diskSpoolBufferSizeMB:设置DiskStore(磁盘缓存)的缓存区大小,默认是30MB
memoryStoreEvictionPolicy:内存存储与释放策略,即达到maxElementsInMemory限制时,Ehcache会根据指定策略清理内存,共有三种策略,分别为LRU(最近最少使用)、LFU(最常用的)、FIFO(先进先出)。
四:Java代码
package com.study.ehcache.test; import java.util.HashMap; import java.util.Map; import net.sf.ehcache.Cache; import net.sf.ehcache.CacheManager; import net.sf.ehcache.Element; import org.junit.Test; public class EhcacheStudy { @Test public void test1{ //创建CacheManager CacheManager manager = CacheManager.create("src/ehcache.xml"); //默认制定src目录下的 ehcache.xml //CacheManager manager2 = CacheManager.create; //创建一个Cache,名字和ehcache.xml里面制定的一致 Cache cache = manager.getCache("studyCache"); //创建Element,并且设置值 Element e1 = new Element("key1","value1"); Element e2 = new Element("key2","value2"); //往缓存中插入值 cache.put(e1); cache.put(e2); //输出结果 System.out.println(cache.get("key1").getObjectValue); System.out.println(cache.get("key2").getObjectValue); } @Test public void test2{ long startTime = System.currentTimeMillis; Map<String,Object> map = new HashMap<String,Object>; for(int i=1;i<=1000000;i++){ String key = "key"+i; String value = "value"+i; map.put(key, value); } long endTime = System.currentTimeMillis; System.out.println(map.get("key500")); long excuteTime = endTime - startTime; System.out.println("excuteTime="+excuteTime); } @Test public void test3{ long startTime = System.currentTimeMillis; CacheManager manager = CacheManager.create("src/ehcache.xml"); Cache cache = manager.getCache("studyCache"); for(int i=1;i<=100000;i++){ String key = "key"+i; String value = "value"+i; Element e = new Element(key,value); cache.put(e); System.out.println(key); } long endTime = System.currentTimeMillis; System.out.println(cache.get("key500").getObjectValue); long excuteTime = endTime - startTime; System.out.println("excuteTime="+excuteTime); } }
1、test1是Ehcache 简单的用法介绍
2、test2是采用 Map 存储多数据测试,结果报内存溢出
3、test3是采用Ehcache 存储多数据测试,我们发现我们在Ehcache.xml 设置 maxElementsInMemory 参数为 1000,但是我们存储了100000 个数据同样能够读出来,因为我们设置了overflowToDisk=true,多余数据存储到了磁盘当中。
五:总结
如果是很少量数据的话我们当然用Map或者session等方式,但是存储数据有限,数据过多的话会内存溢出,而且会严重影响项目速度。
Ehcache存储数据的个数是通过设置Ehcache文件里面参数,我们可以存储很多数据,内存不够话,我们可以存储在磁盘上面。
以上代码和总结都是本人自己观点,如果发现错误或者有更好的解决方案希望大家多多指点,一起进步!
本文暂时没有评论,来添加一个吧(●'◡'●)