转载请注明出处哈:http://carlosfu.iteye.com/blog/2237511


 

一、依赖

1. ehcache依赖

<ehcache.version>2.6.11</ehcache.version>
<dependency><groupId>net.sf.ehcache</groupId><artifactId>ehcache-core</artifactId><version>${ehcache.version}</version>
</dependency>

2. ehcache依赖树: mvn dependency:tree

[INFO] \- net.sf.ehcache:ehcache-core:jar:2.6.11:compile
[INFO] \- org.slf4j:slf4j-api:jar:1.7.5:compile

3. 由于slf4j-api是日志接口,加入具体实现logback(log4j也可以)

<logback.version>1.0.13</logback.version>
<dependency><groupId>ch.qos.logback</groupId><artifactId>logback-core</artifactId><version>${logback.version}</version>
</dependency>
<dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>${logback.version}</version>
</dependency> 

4. 为了方便单元测试,引入junit

<junit.version>4.11</junit.version>
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>${junit.version}</version>
</dependency>

最终pom:

<properties><ehcache.version>2.6.11</ehcache.version><logback.version>1.0.13</logback.version><junit.version>4.11</junit.version></properties><dependencies><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-core</artifactId><version>${logback.version}</version></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>${logback.version}</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>${junit.version}</version></dependency><dependency><groupId>net.sf.ehcache</groupId><artifactId>ehcache-core</artifactId><version>${ehcache.version}</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.1</version><configuration><source>1.7</source><target>1.7</target><encoding>UTF-8</encoding></configuration></plugin></plugins></build>

二、ehcache配置

注意:如果不添加,会使用ehcache-core-2.6.11.jar下的ehcache-failsafe.xml作为默认配置

一般来说需要把ehcache.xml放到classpath下:我们使用极简配置

<?xml version="1.0" encoding="UTF-8" ?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"><cache name="firstEhcache" maxElementsInMemory="10000"></cache>
</ehcache>

三、logback配置

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="5 seconds"><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><root level="INFO"><appender-ref ref="STDOUT"/></root>
</configuration>

四、单元测试

1. 一个实体类:

package com.sohu.tv.ehcache.first;
import java.util.Date;
/*** 俱乐部* * @author leifu* @Date 2015年7月28日* @Time 下午1:43:53*/
public class Club {/*** 俱乐部id*/private int id;/*** 俱乐部名*/private String clubName;/*** 俱乐部描述*/private String clubInfo;/*** 创建日期*/private Date createDate;/*** 排名*/private int rank;public Club(int id, String clubName, String clubInfo, Date createDate, int rank) {super();this.id = id;this.clubName = clubName;this.clubInfo = clubInfo;this.createDate = createDate;this.rank = rank;}public Club() {super();}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getClubName() {return clubName;}public void setClubName(String clubName) {this.clubName = clubName;}public String getClubInfo() {return clubInfo;}public void setClubInfo(String clubInfo) {this.clubInfo = clubInfo;}public Date getCreateDate() {return createDate;}public void setCreateDate(Date createDate) {this.createDate = createDate;}public int getRank() {return rank;}public void setRank(int rank) {this.rank = rank;}@Overridepublic String toString() {return "Club [id=" + id + ", clubName=" + clubName + ", clubInfo=" + clubInfo + ", createDate=" + createDate+ ", rank=" + rank + "]";}
}

2. 单元测试:

package com.sohu.tv.ehcache.first;
import java.util.Date;
import org.junit.BeforeClass;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;
/*** 第一个ehcache测试* * @author leifu* @Date 2015年8月12日* @Time 上午10:14:13*/
public class FirstEhcacheTest {private static Logger logger = LoggerFactory.getLogger(FirstEhcacheTest.class);private static Cache cache;@BeforeClasspublic static void setUp() {CacheManager cacheManager = CacheManager.create(FirstEhcacheTest.class.getClassLoader().getResourceAsStream("ehcache.xml"));// 打印cacheManager管理的cacheString[] cacheNameArr = cacheManager.getCacheNames();for (String cacheName : cacheNameArr) {logger.info("cacheName: {}", cacheName);}cache = cacheManager.getCache("firstEhcache");}@Testpublic void testCRUD() {logger.info("At start, ehcache object size: {}", cache.getSize());// 唯一keyString key = "football:club:1";Club club = new Club(1, "AC", "AC米兰", new Date(), 1);// 增Element element = new Element(key, club);cache.put(element);logger.info("after add ehcache object size: {}", cache.getSize());// 查Element elementResult = cache.get(key);Club clubResult = (Club) elementResult.getObjectValue();logger.info("get key {} value is {}", key, clubResult.toString());// 修改club.setRank(8888);cache.put(element);logger.info("after set ehcache object size: {}", cache.getSize());// 再查Element elementResultAgain = cache.get(key);Club clubResultAgain = (Club) elementResultAgain.getObjectValue();logger.info("get key {} again value is {}", key, clubResultAgain.toString());// 删boolean removeResult = cache.remove(key);logger.info("remove result is {}, after remove ehcache object size: {}", removeResult, cache.getSize());// 增加一条,观察下次启动cache.put(element);logger.info("At final, ehcache object size: " + cache.getSize());// 生产环境不要使用,影响性能logger.info("At final, ehcache memory size: " + cache.calculateInMemorySize());}
}

五、输出:

10:43:11.405 [main] INFO c.s.t.ehcache.first.FirstEhcacheTest - cacheName: firstEhcache
10:43:11.410 [main] INFO c.s.t.ehcache.first.FirstEhcacheTest - At start, ehcache object size: 0
10:43:11.413 [main] INFO c.s.t.ehcache.first.FirstEhcacheTest - after add ehcache object size: 1
10:43:11.416 [main] INFO c.s.t.ehcache.first.FirstEhcacheTest - get key football:club:1 value is Club [id=1, clubName=AC, clubInfo=AC米兰, createDate=Wed Aug 12 10:43:11 CST 2015, rank=1]
10:43:11.416 [main] INFO c.s.t.ehcache.first.FirstEhcacheTest - after set ehcache object size: 1
10:43:11.417 [main] INFO c.s.t.ehcache.first.FirstEhcacheTest - get key football:club:1 again value is Club [id=1, clubName=AC, clubInfo=AC米兰, createDate=Wed Aug 12 10:43:11 CST 2015, rank=8888]
10:43:11.417 [main] INFO c.s.t.ehcache.first.FirstEhcacheTest - remove result is true, after remove ehcache object size: 0
10:43:11.417 [main] INFO c.s.t.ehcache.first.FirstEhcacheTest - At final, ehcache object size: 1
10:43:11.418 [main] INFO c.s.t.ehcache.first.FirstEhcacheTest - At final, ehcache memory size: 1

六、结论、注意、猜想:

1. 如果没有配置diskStore作为持久化数据源,每次启动时候ehcache都是空的(因为ehcache是进程内缓存,会伴随着JVM的结束而消失)

2. ehcache接口中 put代表了add和set。

3. 官方文档中说:cache.calculateInMemorySize()这个方法不要在生产环境中使用,会影响性能。

4. Ehcache的增删改查API使用十分简单。

Ehcache优化配置相当多:各个层级数据容量大小、key过期策略算法、overFlow策略、序列化等等。

BigMemory系列文章--2.Ehcache快速接入相关推荐

  1. openGauss数据库源码解析系列文章——openGauss开发快速入门(二)

    在上一篇openGauss数据库源码解析系列文章--openGauss开发快速入门(上)中,我们介绍了openGauss的安装部署方法,本篇将具体介绍openGauss基本使用. 二. openGau ...

  2. openGauss数据库源码解析系列文章——openGauss开发快速入门(一)

    作为openGauss数据库开发者,在基于开源社区的openGauss版本进行二次开发的过程中,需要完成软件包获取.源码了解.代码修改.编译发布等过程,同时还需要安装数据库以了解数据库的基本特点.验证 ...

  3. Carlosfu技术系列文章总目录

    转载请注明出处哈:http://carlosfu.iteye.com/blog/2240426   刚看了一下这个账号是2009年注册的,当时可能是为了下载javaeye的周刊吧,后来12年开始工作时 ...

  4. 《快速构建Windows 8风格应用》系列文章汇总

    <快速构建Windows 8风格应用>系列的文章基于XAML+C#进行编写,汇总了Windows 8 Store应用开发过程中常用的开发技术点. 对于我个人来说,将自己平时学习和开发过程中 ...

  5. 云原生存储系列文章(一):云原生应用的基石

    作者| 郡宝 阿里云技术专家 参与文末留言互动,即有机会获得赠书福利! 导读:存储服务支撑了应用的状态.数据的持久化,是计算机系统中的重要组成部分,也是所有应用得以运行的基础,其重要性不言而喻.在存储 ...

  6. Prometheus技术系列文章——prometheus调研总结

    Prometheus技术系列文章--prometheus调研总结 prometheus调研总结 文章目录 Prometheus技术系列文章--prometheus调研总结 前言 1. Promethe ...

  7. 小程序变现必备,支付功能快速接入

    从产品框架搭建到页面设计,从数据库建立到核心功能实现,知晓云(cloud.minapp.com)为小程序开发者提供了不少的便捷,例如常用的电商数据表模版和简单好用的 API,省去了后端数据接口的设计和 ...

  8. Scott的ASP.net MVC框架系列文章之四:处理表单数据(2)

    前几周我发表了一系列文章介绍我们正在研究的ASP.NET MVC框架.ASP.NET MVC框架为你提供了一种新的开发Web应用程序的途径,这种途径可以让应用程序变得更加层次清晰,而且更加有利于对代码 ...

  9. UML建模系列文章总结

    一.为什么要学习UML 二.UML的历史 三.UML的特点 四.UML中的视图 五.UML建模工具 六.UML的应用领域 七.UML的构成 1.需求阶段如何书写Use Case 2.设计阶段如何画用例 ...

最新文章

  1. 看看android基础知识,谁帮我作答
  2. 脚本实现用户登录显示信息
  3. iOS下Html页面中input获取焦点弹出键盘时挡住input解决方案
  4. 日常生活 -- 开博一周年
  5. 基金评审人总结的15条写作技巧
  6. 谷歌浏览器出现方格xp系统_win10系统谷歌浏览器扩展程序打不开的解决方案
  7. windows下 sbulime text 安装less2css踩的几个坑
  8. nodejs开发 过程中express路由与中间件的理解 - pyj063 - 博客园
  9. 8 大错误SQL用法,你肯定踩过坑!
  10. c语言编码风格,讲嵌入式C语言编码风格.ppt
  11. 数据写入mysql的方式,FMDB写入大量数据的处理方法
  12. sql慢查询问题排查
  13. keepalived nginx 双机热备图文讲解
  14. 「Luogu P2201」数列编辑器 解题报告
  15. 卫星轨道的估计问题(Matlab)(二):扩展卡尔曼滤波(EKF)对新问题的尝试
  16. Word2010与MathType6.7兼容性问题解决方案
  17. Bypassing Stack Cookies, SafeSeh, SEHOP, HW DEP and ASLR
  18. java 旋转方向_Java 旋转PDF页面方向
  19. 陕西省计算机分数线,2019陕西省各大学录取分数线最新汇总
  20. 个人笔记-如何学习(上)

热门文章

  1. 个人管理:简单,我微博中的一句话,总有你喜欢的
  2. Testing Windows Live Writer 2
  3. 阿里敏捷实践| 4个迭代,从批量交付向持续交付转型
  4. linux命令行安装使用KVM
  5. SimpleDateFormat处理 dd-MMM-yy类型日期
  6. 1.15 克隆虚拟机
  7. Python黑帽编程 3.1 ARP欺骗
  8. codeforces水题100道 第五题 Codeforces Round #304 (Div. 2) A. Soldier and Bananas (math)
  9. Vertica 高可用性测试
  10. android 解决ListView点击与滑动事件冲突