之前一直感觉缓存是高上大的东西,没有心思去研究。做了之后发现,简单的使用还是很容易的。这里记录ehcache在jfinal中的简单使用。
1.ehcahe简介
EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。
看到官网上已经3.0了。
2.作用
我把它当做一个可以存储数据和读取数据的存在。缓存其实就一个key-value的数据存储工具。目前我使用过两个方面。
一是缓存数据库的数据。
都说连接数据库的开销很大,所以对数据变化较小的一部分可以缓存起来,下次直接从缓存中取数据。(关于数据的安全性未曾考虑)。
二是存储变量。
在web后端开发过程中,有些数据需要保存起来方便下次使用。比如短信的验证码。我之前都是在类中添加一个map类变量,然后存入map,下次取出或者销毁。这样做事可以的,类实例化后。类变量就加载到内存中了,可以存储数据。但有个问题,关于类的创建和销毁的声明周期问题。不能确保他什么时候去销毁。或者说,这一块我了解有限,还没研究到。
因此,放到缓存中就可以了。缓存可以设置数据的大小,失效时间。
3.用到的两个基本实现
1 <?xml version="1.0" encoding="UTF-8"?>
2 <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3 xsi:noNamespaceSchemaLocation="ehcache.xsd"
4 updateCheck="false" monitoring="autodetect"
5 dynamicConfig="true">
7 <diskStore path="java.io.tmpdir"/>
9 <defaultCache
10 maxEntriesLocalHeap="10000"
11 eternal="false"
12 overflowToDisk="true"
13 timeToIdleSeconds="20"
14 timeToLiveSeconds="60">
15 </defaultCache>
17 <!-- 内存中最多可以缓存1000个element,超出1000的,不输出到磁盘中。缓存是永久有效的
18 name:cache唯一标识
19 maxElementsInMemory:内存中最大缓存对象数
20 eternal:Element是否永久有效,一但设置了,timeout将不起作用。
21 verflowToDisk:配置此属性,当内存中Element数量达到maxElementsInMemory时,Ehcache将会Element写到磁盘中。
22 memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。
23 默认策略是LRU(最近最少使用)。还可以设置为FIFO(先进先出)或是LFU(较少使用)。
24 -->
25 <cache name="zone"
26 maxElementsInMemory="1000"
27 eternal="true"
28 overflowToDisk="false"
29 memoryStoreEvictionPolicy="LRU"
30 />
32 <!--
33 内存中最多可缓存10000个Element,其中的element会在闲置5分钟或是存活10分钟之后失效。
34 If there are more than 10000 elements it will overflow to the
35 disk cache, which in this configuration will go to wherever java.io.tmp is
36 defined on your system. On a standard Linux system this will be /tmp"
37 diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。
38 timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。
39 timeToLiveSeconds:设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大。
40 transactionalMode="off" 使ehcache作为JTA事务的参与者
maxEntriesLocalHeap:堆内存中最大缓存对象数,0没有限制
Sets the maximum number of objects that will be held on heap memory. 0 = no limit.
maxEntriesLocalDisk:磁盘中的最大对象数,默认为0不限制
Sets the maximum number of objects that will be maintained in the DiskStore
The default value is zero, meaning unlimited.
41 -->
42 <cache name="mobileMsg"
43 maxEntriesLocalHeap="10000"
44 maxEntriesLocalDisk="1000"
45 eternal="false"
46 overflowToDisk="true"
47 diskSpoolBufferSizeMB="20"
48 timeToIdleSeconds="300"
49 timeToLiveSeconds="600"
50 memoryStoreEvictionPolicy="LFU"
51 transactionalMode="off"
52 />
54 </ehcache>
3.1追加使用的问题:
- 从cache取出的对象默认会 copyOnRead="false" copyOnWrite="false".如果对取出的对象操作,就会修改cache中的对象。因为序列化问题。因此,如果想要对缓存的数据修改而不改变缓存中的原始数据,应该将这两个设为true。
4.在jfinal中的使用
jfinal框架集成了ehcache,只要简单配置就可以使用了。配置如下:
4.1在commonconfig中添加插件:
1 @Override
2 public void configPlugin(Plugins me) {
3 me.add(new EhCachePlugin());
4 }
4.2.通过CacheKit管理缓存
上面的配置可以看出,一个缓存(姑且这么叫)由一个name字段唯一标识,数据又是key-value,因此,只有name-key就可以唯一标识value.
4.2.1将变量加入缓存:
1 CacheKit.put(cacheName, key, value);
- cacheName:在xml中配置的缓存name字段
- key:唯一标识
- value:你要存储的对象,value可以是任何对象、数据类型,比如person,map,list等
4.2.2取出
1 CacheKit.get(cacheName, key);
4.3findByCache中使用
这个直接使用就是加入缓存了。
1 Db.findByCache(cacheName, key, sql);
ehcache基本原理
(2014-12-29 11:03:33)
转载 ▼ http://blog.sina.com.cn/s/blog_4adc4b090102vh1s.html
ehcache是一个用 Java 实现的使用简单,高速,实现线程安全的缓存管理类库,ehcache提供了用内存,磁盘 文件存储 ,以及 分布式 存储方式等多种灵活的cache管理方案。同时ehcache作为开放 源代码 项目 ,采用限制比较宽松的Apache License V2.0作为授权方式,被广泛地用于Hibernate, Spring,Cocoon等其他 开源 系统 。
Ehcache的类层次模型主要为三层,最上层的是CacheManager,他是操作Ehcache的入口。我们可以通过CacheManager.getInstance()获得一个单个的CacheManager,或者通过CacheManager的构造函数创建一个新的CacheManager。每个CacheManager都管理着多个Cache。而每个Cache都以一种类Hash的方式,关联着多个Elemenat。而Element则是我们用于存放要缓存内容的地方。
ehcache的刷新策略 ehcache的刷新策略是当缓存在放入的时候记录一个放入时间,它是用Lazy Evict的方式,在取的时候同设置的TTL比较
ehcache缓存的3种清空策略: 1 FIFO,先进先出 2 LFU,最少被使用,缓存的元素有一个hit属性,hit值最小的将会被清出缓存。 3 LRU,最近最少使用的,缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。
事件处理 可以为CacheManager添加事件监听,当对CacheManager增删Cache时,事件处理器将会得到通知。要配置事件处理,需要通过ehcache的配置文件来完成。 可以为Cache添加事件监听,当对Cache增删Element时,事件处理器将会得到通知。要配置事件处理,需要通过ehcache的配置文件来完成。
ehcache参数配置: