ehcache缓存入门学习
1,概念 特性
EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。
主要的特性有:1. 快速2. 简单3. 多种缓存策略4. 缓存数据有两级:内存和磁盘,因此无需担心容量问题5. 缓存数据会在虚拟机重的过程中写入磁盘6. 可以通过RMI、可插入API等方式进行分布式缓存7. 具有缓存和缓存管理器的侦听接口8. 支持多缓存管理器实例,以一个实例的多个缓存区域9. 提供Hibernate的缓存实现
2,属于哪种类型 的缓存
ehcache缓存属于之前提到过的那种 LocalCache类型,缓存和应用是在一个jvm中的,正常情况下和其他jvm或者其他系统没有通信的,不能共用。是完全独立在使用它的那个jvm中的。
3大概的使用方法,
使用的大概就是,在一个配置文件配置缓存的各种信息,然后java代码使用的时候,去读取这个文件,并组成对象,然后就可以获取到配置的缓存对象,然后使用的时候,将要缓存的内容,key-value形式放入到配置的缓存对象里去。获取也一样。
4,配置文件介绍--只是简单的介绍,具体的配置信息需要的话搜索下
xml文件中可以配置的大体有
1,如果需要写入硬盘的话,配置一个磁盘路径
<disStore path=”java.io.tmpdir”/>也可以配置一个物理路径
2,cachemanager的一个监听器工厂,监听器,可以用来监听缓存对象的增加了什么的,做一下缓存的统计工作。
CacheManagerEventListenerFactory CacheManagerEventListener 写监听器的时候 需要继承实现一下ehcache自己的抽象类
3,cache的配置,配置了缓存的各种存储信息,更新策略信息等。
· name:Cache的唯一标识
· maxElementsInMemory:内存中最大缓存对象数。
· maxElementsOnDisk:磁盘中最大缓存对象数,若是0表示无穷大。
· eternal:Element是否永久有效,一但设置了,timeout将不起作用。
· overflowToDisk:配置此属性,当内存中Element数量达到maxElementsInMemory时,Ehcache将会Element写到磁盘中。
· timeToIdleSeconds:设置Element在失效前的允许闲置时间。仅当element不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。
· timeToLiveSeconds:设置Element在失效前允许存活时间。最大时间介于创建时间和失效时间之间。仅当element不是永久有效时使用,默认是0.,也就是element存活时间无穷大。
· diskPersistent:是否缓存虚拟机重启期数据。(这个虚拟机是指什么虚拟机一直没看明白是什么,有高人还希望能指点一二)。
· diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。
· diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。
· memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。这里比较遗憾,Ehcache并没有提供一个用户定制策略的接口,仅仅支持三种指定策略,感觉做的不够理想。
4,cache的监听器工厂,监听器,可以用来监听该缓存对象缓存内容的一些操作。
cacheEventListenerFactory cacheEventListener 写监听器的时候 需要继承实现一下ehcache自己的抽象类
5,还有就是一些集群方面的配置。
cacheManagerPeerProviderFactory cacheManagerPeerListenerFactory
5,java代码使用
具体方法就是,先用cachemanager通过配置文件,创建一个cachemanager对象,然后从这个对象中可以根据配置的cache的name属性的值
获取到具体的缓存对象,然后可以从这个对象中根据key找到缓存的element对象,添加缓存的时候也是 先组装一个element对象,然后直接将对象put到cache对象中即可。如下是在ServletContextListener项目启动的时候 加载一些东西到缓存,比如数据字典什么的 。
@Override public void contextInitialized(ServletContextEvent arg0) { CacheManager cm = CacheManager.create(arg0.getServletContext().getRealPath("\WEB-INF\classes\ehcache.xml")); Cache ca = cm.getCache("mycache"); Element e = new Element("username", "liubanban"); Element e1 = new Element("usertel", "18515154585"); ca.put(e); ca.put(e1); arg0.getServletContext().setAttribute("mycache", ca); }
6,集群问题
因为ehcache缓存是和jvm共享的,那么就会有这样的一个问题,就是当项目通过集群结构来部署的时候,每次请求都有可能分发到不同的jvm中,那么整体系统的缓存内容数据就不一致了。失去了缓存的意义,这里ehcache也有解决方案。可以在xml文件通过配置,然后实现缓存内容同步。具体配置信息自行百度下了。大致上就是通过监听或者广播的方法,先获知其他节点缓存有更新,然后再讲最新的数据分发到所有节点进行更新,以保证集群所有节点缓存数据一致。