Ehcache的简单学习1-Ehcache和Spring的结合使用

2017-12-30 12:18:25来源:oschina作者:wind2012人点击

分享
一、Ehcache的了解

JAVA缓存实现方案有很多,最基本的自己使用Map去构建缓存,或者使用memcached或Redis,但是上述两种缓存框架都要搭建服务器,而Map自行构建的缓存可能没有很高的使用效率,那么我们可以尝试一下使用Ehcache缓存框架。


Ehcache主要基于内存缓存,磁盘缓存为辅的,使用起来方便。下面介绍如何在项目中使用Ehcache


二、入门教程
1.maven引入



nexus.center
local private nexus
http://search.maven.org

true


false





net.sf.ehcache
ehcache
2.10.4

2.建立ehcache.xml

放在maven项目中的src/main/resources目录中。


<?xml version="1.0" encoding="UTF-8"?>




maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
maxElementsOnDisk="10000000"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">

name="cachea"
eternal="false"
timeToIdleSeconds="1200"
timeToLiveSeconds="1200"
maxEntriesLocalHeap="10000"
maxEntriesLocalDisk="10000000"
diskExpiryThreadIntervalSeconds="120"
overflowToDisk="false"
memoryStoreEvictionPolicy="LRU">


Xml配置说明:


diskStore:当内存缓存中对象数量超过maxElementsInMemory时,将缓存对象写到磁盘缓存中(需对象实现序列化接口)


:用来配置磁盘缓存使用的物理路径,Ehcache磁盘缓存使用的文件后缀名是*.data和*.index


name:缓存名称,cache的唯一标识(ehcache会把这个cache放到HashMap里)。


maxElementsInMemory:缓存最大个数。


eternal:对象是否永久有效,一但设置了,timeout将不起作用。


timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。


timeToLiveSeconds:设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大。


overflowToDisk:当内存中对象数量达到maxElementsInMemory时,Ehcache将会对象写到磁盘中。


diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。


maxElementsOnDisk:硬盘最大缓存个数。


diskPersistent:是否缓存虚拟机重启期数据,默认为false,当这个属性的值为true时,系统在初始化时会在磁盘中查找文件名为cache名称,后缀名为index的文件 这个文件中存放了已经持久化在磁盘中的cache的index,找到后会把cache加载到内存 要想把cache真正持久化到磁盘,写程序时注意执行net.sf.ehcache.Cache.put(Element element)后要调用flush()方法。


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


memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。


clearOnFlush:内存数量最大时是否清除。


3.与Spring的CacheManager结合
<?xml version="1.0" encoding="UTF-8"?>
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:cache="http://www.springframework.org/schema/cache"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/cache
http://www.springframework.org/schema/cache/spring-cache.xsd">

























class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">




classpath*:*.properties




注意:我们要绑定cache:annotation-driven的前缀cache .可以不用版本号!为啥不用写版本号,可以参考我的博客:http://blog.51cto.com/hanchaohan/1915998


xmlns:cache="http://www.springframework.org/schema/cache"


http://www.springframework.org/schema/cachehttp://www.springframework.org/schema/cache/spring-cache.xsd"


4.代码使用
package com.book.web.controller;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.Cache;
import org.springframework.cache.Cache.ValueWrapper;
import org.springframework.cache.CacheManager;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.book.core.model.User;
/**
* ehcache测试类
* @author liweihan
*
*/
@Controller
@RequestMapping("/cache")
public class TestEhCacheController {

@Autowired
private CacheManager cacheManager;

private static Logger logger = LoggerFactory.getLogger(TestEhCacheController.class);

/**
* 测试:放入缓存和取数据
* @return
*/
@ResponseBody
@RequestMapping("/testa")
public String testA() {
//获取testa缓存容器
Cache cache = cacheManager.getCache("cachea");
User user = new User();
user.setId(1);
user.setName("hanchao");

//将数据放入缓存
cache.put(1,user);

//获取数据
//方法1
User user2 = (User) cache.get(1).get();
logger.info("result1:" +user2.getName());

//方法2
User user3 = cache.get(1, User.class);
logger.info("result2:" + user3.getName());

return "a";
}
/**
* 测试取数据
* @return
*/
@ResponseBody
@RequestMapping("/testb")
public String testB() {
//获取testa缓存容器
Cache cache = cacheManager.getCache("cachea");

//获取数据
//方法1
// User user2 = (User) cache.get(1).get();
// logger.info("result1:" + user2.getName());

//方法2
/*User user3 = cache.get(1, User.class);
logger.info("result2:" +user3.getName());*/

//☆☆注意事项:key的类型必须也一样!☆☆
/* User user = (User) cache.get("1").get();
logger.info("类型不一样不行:" + user.getName());*/

//方法3:避免获取失效缓存时出现异常的情况
ValueWrapper valueWrapper = cache.get(1);
if (valueWrapper != null) {
User user = (User)valueWrapper.get();
logger.info("result3:" +user.getName());
}

return "b";
}

/**
* 测试删除数据
* @return
*/
@ResponseBody
@RequestMapping("/testc")
public String testC() {
//获取缓存容器
Cache cache = cacheManager.getCache("cachea");
cache.evict(1);
return "c";
}
}

我用的是springmvc,所以,写法是上面的。可以通过:


http://localhost:8080/cache/testa ,


http://localhost:8080/cache/testb,


http://localhost:8080/cache/testc


进行测试,看打印的情况。


注意事项:put进去时的key是Long类型的,get的时候也只能传入对应Long类型的key才能获取到对应的value,如果传入的是String类型的key,即使两个key的值是一致的,也会导致无法获取到对应的value。


5.LRU和LFU的区别

LRU和LFU是不同的!


LRU是最近最少使用页面置换算法(Least Recently Used),也就是首先淘汰最长时间未被使用的页面!


LFU是最近最不常用页面置换算法(Least Frequently Used),也就是淘汰一定时期内被访问次数最少的页!


比如,第二种方法的时期T为10分钟,如果每分钟进行一次调页,主存块为3,若所需页面走向为2 1 2 1 2 3 4


注意,当调页面4时会发生缺页中断


若按LRU算法,应换页面1(1页面最久未被使用) 但按LFU算法应换页面3(十分钟内,页面3只使用了一次)


可见LRU关键是看页面最后一次被使用到发生调度的时间长短,


而LFU关键是看一定时间段内页面被使用的频率!


三、参考链接

https://www.jianshu.com/p/c1690f9d953e?utm_source=tuicool&utm_medium=referral


不与spring结合的ehcache链接


http://blog.csdn.net/u010351766/article/details/521


http://blog.csdn.net/u012255097/article/details/54576720

Java缓存Ehcache-核心类和方法介绍及代码实例


http://blog.csdn.net/xiajun07061225/article/details/39612375

关于Java缓存,可以参考一下这篇文章:https://www.jianshu.com/p/4194483127fe


Ehcache官网地址:


http://www.ehcache.org/


http://www.ehcache.org/documentation/


微信扫一扫

第七城市微信公众平台