相关文章推荐
斯文的紫菜汤  ·  深入Mysql:嵌套循环算法,explain ...·  1 年前    · 
聪明的炒粉  ·  Android中@+id 与 ...·  1 年前    · 
机灵的烤地瓜  ·  Unable to connect to ...·  1 年前    · 
成熟的水龙头  ·  为什么还有人留在教培机构?_创事记_新浪科技 ...·  2 年前    · 
慷慨的伤疤  ·  flutter 中 List 和 Map ...·  2 年前    · 
Code  ›  简单的使用ehcache开发者社区
缓存 element ehcache ehcache使用
https://cloud.tencent.com/developer/article/1058603
酒量小的针织衫
12 月前
Ryan-Miao

简单的使用ehcache

前往小程序,Get 更优 阅读体验!
立即前往
腾讯云
开发者社区
文档 建议反馈 控制台
首页
学习
活动
专区
工具
TVP
最新优惠活动
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
Ryan-Miao
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
社区首页 > 专栏 > 简单的使用ehcache

简单的使用ehcache

作者头像
Ryan-Miao
发布 于 2018-03-13 12:08:12
4.4K 0
发布 于 2018-03-13 12:08:12
举报
文章被收录于专栏: Ryan Miao

之前一直感觉缓存是高上大的东西,没有心思去研究。做了之后发现,简单的使用还是很容易的。这里记录ehcache在jfinal中的简单使用。

1.ehcahe简介

EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。

看到官网上已经3.0了。

2.作用

我把它当做一个可以存储数据和读取数据的存在。缓存其实就一个key-value的数据存储工具。目前我使用过两个方面。

一是缓存数据库的数据。

都说连接数据库的开销很大,所以对数据变化较小的一部分可以缓存起来,下次直接从缓存中取数据。(关于数据的安全性未曾考虑)。

二是存储变量。

在web后端开发过程中,有些数据需要保存起来方便下次使用。比如短信的验证码。我之前都是在类中添加一个map类变量,然后存入map,下次取出或者销毁。这样做事可以的,类实例化后。类变量就加载到内存中了,可以存储数据。但有个问题,关于类的创建和销毁的声明周期问题。不能确保他什么时候去销毁。或者说,这一块我了解有限,还没研究到。

因此,放到缓存中就可以了。缓存可以设置数据的大小,失效时间。

3.用到的两个基本实现

代码语言: javascript
复制
 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中添加插件:

代码语言: javascript
复制
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将变量加入缓存:

代码语言: javascript
复制
1 CacheKit.put(cacheName, key, value);
  • cacheName:在xml中配置的缓存name字段
  • key:唯一标识
  • value:你要存储的对象,value可以是任何对象、数据类型,比如person,map,list等

4.2.2取出

代码语言: javascript
复制
1 CacheKit.get(cacheName, key);

4.3findByCache中使用

这个直接使用就是加入缓存了。

代码语言: javascript
复制
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参数配置:

 
推荐文章
斯文的紫菜汤  ·  深入Mysql:嵌套循环算法,explain分析sql句法 - Mr-chen - 博客园
1 年前
聪明的炒粉  ·  Android中@+id 与 @id的区别 - 双间 - 博客园
1 年前
机灵的烤地瓜  ·  Unable to connect to the server: x509: certificate is valid for_kubernetes_K8SOQ-K8S/Kubernetes
1 年前
成熟的水龙头  ·  为什么还有人留在教培机构?_创事记_新浪科技_新浪网
2 年前
慷慨的伤疤  ·  flutter 中 List 和 Map 的用法 - 每天都要进步一点点 - 博客园
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号