基本要素:版本、概念与抽象

  • Ehcache 3.x是一个用Java语言实现的缓存库,并且实现了 JSR107规范
  • Ehcache从2.x升级到3.x后,Maven依赖从 net.sf.ehcache:ehcache:2.x 变成了org.ehcache:ehcache:3.x
  • Ehcache基本概念有:
    • 要缓存的对象是“键值对”
    • 键值对的容器就是“缓存Cache”
    • 每个缓存有自己的配置,就是“缓存配置CacheConfiguration”,通过CacheConfigurationBuilder构建
    • Ehcache中可以管理多个缓存,需要一个“缓存管理器CacheManager”。通过CacheManager+缓存的名称可以创建或获得缓存
    • 缓存对象的存储位置有: 堆内存heap;堆外内存offheap;硬盘disk。 offheap就是位于JVM外的内存,不受GC管理

通过编程方式创建缓存

引入依赖

        <dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>3.8.0</version>
</dependency>

测试代码

    @Test
public void testA() {
CacheManagerBuilder builder = CacheManagerBuilder.newCacheManagerBuilder();
CacheManager cacheManager = builder.build();
cacheManager.init();//cacheManager创建后一定要初始化 ResourcePoolsBuilder poolsBuilder = ResourcePoolsBuilder.newResourcePoolsBuilder();
ResourcePools pools = poolsBuilder.heap(10, EntryUnit.ENTRIES).build();//用于配置一个cache的heap/offheap/disk的容量.
CacheConfigurationBuilder<Long, String> cacheConfigBuilder = CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, pools);
CacheConfiguration<Long, String> cacheConfiguration = cacheConfigBuilder.build();//创建一个缓存配置 Cache myCache = cacheManager.createCache("myCache", cacheConfiguration);//根据缓存名称和缓存配置创建缓存
myCache.put(1L, "hahaha");
logger.info("{}", myCache.get(1L));
cacheManager.close();//系统关闭时, 应调用cacheManager的close方法
}

通过XML配置创建缓存

Ehcache的XML配置:

<?xml version="1.0" encoding="UTF-8" ?>
<config
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xmlns='http://www.ehcache.org/v3'
xsi:schemaLocation="http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core.xsd"> <!-- 可以把多个缓存配置相同的部分抽象出来形成cache-template模板 -->
<cache-template name="myDefaults">
<key-type>java.lang.Long</key-type>
<value-type>java.lang.String</value-type>
<heap unit="entries">200</heap>
</cache-template> <cache alias="foo">
<key-type>java.lang.String</key-type>
<value-type>java.lang.String</value-type>
<resources>
<heap unit="entries">20</heap> <!-- heap可以存储20个元素 -->
<offheap unit="MB">10</offheap> <!-- offheap可以存储10MB -->
</resources>
</cache> <!-- 继承cache-template模板 -->
<cache alias="bar" uses-template="myDefaults">
<key-type>java.lang.Number</key-type>
</cache> <cache alias="simpleCache" uses-template="myDefaults" /> </config>

测试代码:

    @Test
public void testB() {
URL ehcacheConfigUrl = getClass().getResource("/ehcache.xml");
Configuration configuration = new XmlConfiguration(ehcacheConfigUrl); //从XML配置改造缓存配置
CacheManager cacheManager = CacheManagerBuilder.newCacheManager(configuration);//创建CacheManager
cacheManager.init(); Cache<String, String> foo = cacheManager.getCache("foo", String.class, String.class);//从CachaManager用缓存名称获取缓存
foo.put("1", "hehehe");
logger.info("{}", foo.get("1")); Cache<Number, String> bar = cacheManager.getCache("bar", Number.class, String.class);
bar.put(1, "hohoho");
logger.info("{}", bar.get(1)); cacheManager.close(); }

通过JSR107(JCache)的api获取Ehcache的缓存--编程方式

    @Test
public void testA() { //CachingProvider provider = Caching.getCachingProvider("org.ehcache.jsr107.EhcacheCachingProvider");
CachingProvider provider = Caching.getCachingProvider();//通过spi技术找到provider. 适用于类路径中只有一个JCache实现, 否则得用上面一行代码指明provider
CacheManager cacheManager = provider.getCacheManager(); ResourcePoolsBuilder poolsBuilder = ResourcePoolsBuilder.newResourcePoolsBuilder();
ResourcePools pools = poolsBuilder.heap(10, EntryUnit.ENTRIES).build();
CacheConfigurationBuilder<Long, String> configBuilder = CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, pools);
CacheConfiguration<Long, String> cacheConfig = configBuilder.build();//ehcache的configuration Cache<Long, String> cache = cacheManager.createCache("myCache", Eh107Configuration.fromEhcacheCacheConfiguration(cacheConfig));//通过Eh107Configuration将ehcache的config转为jcache的config
cache.put(1L, "hahaha");
logger.info("{}", cache.get(1L));
cacheManager.close(); }

通过JSR107(JCache)的api获取Ehcache的缓存--XML配置

引入JSR107规范

        <dependency>
<groupId>javax.cache</groupId>
<artifactId>cache-api</artifactId>
<version>1.1.1</version>
</dependency>

Ehcache的XML配置采用上面的

测试代码:

    @Test
public void testB() throws Exception { CachingProvider provider = Caching.getCachingProvider("org.ehcache.jsr107.EhcacheCachingProvider");
URI uri = getClass().getResource("/ehcache.xml").toURI();
CacheManager cacheManager = provider.getCacheManager(uri, getClass().getClassLoader());
Cache<String, String> cache = cacheManager.getCache("foo", String.class, String.class);
cache.put("1", "hehehe");
logger.info("{}", cache.get("1"));
cacheManager.close(); }

通过JCache在Spring中注入Ehcache

Spring的XML配置

    <bean id="jCacheManager" class="org.springframework.cache.jcache.JCacheManagerFactoryBean">
<property name="cacheManagerUri" value="classpath:ehcache.xml" />
</bean> <bean id="cacheManager" class="org.springframework.cache.jcache.JCacheCacheManager">
<property name="cacheManager" ref="jCacheManager" />
</bean>

测试代码:

@ContextConfiguration("classpath:spring.xml")
public class SpringJcacheEhcacheTest extends AbstractTestNGSpringContextTests { private static final Logger logger = LoggerFactory.getLogger(SpringJcacheEhcacheTest.class); @Autowired
private CacheManager cacheManager; @Test
public void testA() {
Cache<Number, String> barCache = cacheManager.getCache("bar", Number.class, String.class);
barCache.put(1, "hahaha");
barCache.put(2L, "hehehe");
logger.info("{}", barCache.get(1));
logger.info("{}", barCache.get(2L));
cacheManager.close();
} }

其他--在Spring中注入Ehcache 2.x

引入Ehcache2.x

        <dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>2.10.6</version>
</dependency>

Ehcache 2.x配置

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
updateCheck="false" monitoring="autodetect" dynamicConfig="true"> <diskStore path="java.io.tmpdir"/> <defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
maxElementsOnDisk="10000000"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU"
/> <cache name="foo"
eternal="false"
timeToLiveSeconds="300"
maxElementsInMemory="2000"
maxElementsOnDisk="20000"
overflowToDisk="true"
diskPersistent="true"
memoryStoreEvictionPolicy="FIFO"/> </ehcache>

spring的XML配置

    <bean id="cacheManagerFactory" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
<property name="configLocation" value="classpath:ehcache-2.x.xml"/>
</bean> <bean id="cacheManager2.x" class="org.springframework.cache.ehcache.EhCacheCacheManager">
<property name="cacheManager" ref="cacheManagerFactory"/>
</bean>

测试代码:

@ContextConfiguration("classpath:spring.xml")
public class SpringEhcache2xTest extends AbstractTestNGSpringContextTests { private static final Logger logger = LoggerFactory.getLogger(SpringEhcache2xTest.class); @Autowired
private EhCacheCacheManager ehCacheCacheManager; @Test
public void testA() {
CacheManager cacheManager = ehCacheCacheManager.getCacheManager();
Cache cache = cacheManager.getCache("foo");
Element ele = new Element(1L, "Ehcache 2.x");
cache.put(ele);
logger.info("{}", cache.get(1L).getObjectValue());
cacheManager.shutdown();
} }

最后

Ehcache 3.x官方文档: http://www.ehcache.org/documentation/3.8/getting-started.html

完整代码: https://github.com/JamboSonng/Demo-Master/tree/master/Master-Ehcache

0079 Ehcache 3.x应用入门及通过JCache与Spring整合的更多相关文章

  1. 项目一:第十四天 1.在realm中动态授权 2.Shiro整合ehcache 缓存realm中授权信息 3.动态展示菜单数据 4.Quartz定时任务调度框架—Spring整合javamail发送邮件 5.基于poi实现分区导出

    1 Shiro整合ehCache缓存授权信息 当需要进行权限校验时候:四种方式url拦截.注解.页面标签.代码级别,当需要验证权限会调用realm中的授权方法   Shiro框架内部整合好缓存管理器, ...

  2. Spring整合Ehcache管理缓存

    前言 Ehcache 是一个成熟的缓存框架,你可以直接使用它来管理你的缓存. Spring 提供了对缓存功能的抽象:即允许绑定不同的缓存解决方案(如Ehcache),但本身不直接提供缓存功能的实现.它 ...

  3. Spring整合Ehcache管理缓存(转)

    目录 前言 概述 安装 Ehcache的使用 HelloWorld范例 Ehcache基本操作 创建CacheManager 添加缓存 删除缓存 实现基本缓存操作 缓存配置 xml方式 API方式 S ...

  4. Ehcache和Spring整合

    Ehcache是使用Java编写的缓存框架,比较常用的是,整合在Hibernate和MyBatis这种关系型数据库持久框架. 不过现在用NoSQL也比较盛行,要应用Ehcache,整合起来就没法按照那 ...

  5. ehcache的基本使用及Spring整合

    1.ehcache:百度百科这样解释的,EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider.总的来说,他的出现就是减少对数据 ...

  6. Spring Boot入门教程1、使用Spring Boot构建第一个Web应用程序

    一.前言 什么是Spring Boot?Spring Boot就是一个让你使用Spring构建应用时减少配置的一个框架.约定优于配置,一定程度上提高了开发效率.https://zhuanlan.zhi ...

  7. Spring Boot入门教程2-1、使用Spring Boot+MyBatis访问数据库(CURD)注解版

    一.前言 什么是MyBatis?MyBatis是目前Java平台最为流行的ORM框架https://baike.baidu.com/item/MyBatis/2824918 本篇开发环境1.操作系统: ...

  8. Ehcache 3.7文档—基础篇—JCache aka JSR-107

    一. 概述JCache Java临时缓存API(JSR-107),也被称为JCache,它是一个规范在javax.cache.API中定义的.该规范是在Java Community Process下开 ...

  9. Spring整合EHCache框架

    在Spring中使用缓存可以有效地避免不断地获取相同数据,重复地访问数据库,导致程序性能恶化. 在Spring中已经定义了缓存的CacheManager和Cache接口,只需要实例化便可使用. Spr ...

随机推荐

  1. Istio技术与实践02:源码解析之Istio on Kubernetes 统一服务发现

    前言 文章Istio技术与实践01: 源码解析之Pilot多云平台服务发现机制结合Pilot的代码实现介绍了Istio的抽象服务模型和基于该模型的数据结构定义,了解到Istio上只是定义的服务发现的接 ...

  2. layui upload 在JS动态加载内容后, 点击按钮无反应

    /** * 根据用户选择的不同规格选项 * 返回 不同的输入框选项 */ function ajaxGetSpecInput2(spec_arr) { var goods_id = $('#goods ...

  3. R-corrplot相关性绘图,只有你想不到的

    初步接触数据集,探索性分析后,经常需要做一个相关分析,得到各变量间的相关系数以及显著性水平. 本文介绍一下R-corrplot包进行相关可视化展示. 一 数据准备 载入所需的R包,利用公共数据集mtc ...

  4. c#泛型约束(转载)

    博客地址:https://www.cnblogs.com/zhengwk/p/5541921.html 六种类型的约束: T:结构 类型参数必须是值类型.可以指定除 Nullable 以外的任何值类型 ...

  5. MyEclipse eclipse console edit packageExplorer 颜色设置、个性化、常用设置

    下列教程的图片是在 myeclipse2014 破解版上进行,会有些许不同,仅供参考! 1 编辑区颜色设置 主题设置 豆沙绿设置 RGB 203 233 207 2 console 3主题选择 4 去 ...

  6. requests模块发送数据

    通过json dumps发送 import requests import json def agent(): """ 执行命令采集硬件信息 将执行的信息发送给API : ...

  7. wireshark 分析过滤数据

    1.过滤IP,如来源IP或者目标IP等于某个IP例子:ip.src eq 192.168.1.107 or ip.dst eq 192.168.1.107或者ip.addr eq 192.168.1. ...

  8. BPM软件_K2再度入选Gartner iBPMS MQ挑战者象限_全球领先的工作流引擎

    在Gartner 于1月最新发布的2018 iBPMS MQ报告中,K2再度入选“挑战者”象限,相较去年,K2在“前瞻性”方面有了显著提升. Gartner对该标准的定义为:供应商对市场具有清晰认识, ...

  9. IEAD工具教你创建maven项目

    之前一直用的是其他的开发工具,maven到目前为止也就用了3个月,今天又时间整理一些初期的使用方法,仅供参照. 为什么要用maven 原因很简单,因为使用maven,会使得项目非常容易管理. 举个例子 ...

  10. JavaSpring【二、IOC】

    概述: 接口及面向接口编程 接口:用于沟通的中介物的抽象,实体把自己提供给外界的方法的抽象化说明,将声明和实现分离,使其能够改变内部而不影响与外部的交互方式 面向接口编程:在结构设计中,分清层次及调用 ...