缓存利器之Ehcache
EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点。是一种广泛使用的开源Java分布式缓存。主要面向通用缓存,Java EE和轻量级容器。另外Spring 提供了对缓存功能的抽象:即允许绑定不同的缓存解决方案(如Ehcache),但本身不直接提供缓存功能的实现。ehcache是一个用Java实现的使用简单,高速,实现线程安全的缓存管理类库,ehcache提供了用内存,磁盘文件存储,以及分布式存储方式等多种灵活的cache管理方案。同时ehcache作为开放源代码项目,采用限制比较宽松的Apache License V2.0作为授权方式,被广泛地用于Hibernate, Spring,Cocoon等其他开源系统。它支持注解方式使用缓存,非常方便。
1.2 Ehcache的特点
(1)快速简单,具有多种缓存策略
(2)缓存数据有两级为内存和磁盘,缓存数据会在虚拟机重启的过程中写入磁盘
(3)可以通过RMI、可插入API等方式进行分布式缓存
(4)具有缓存和缓存管理器的侦听接口
(5)支持多缓存管理器实例,以及一个实例的多个缓存区域。并提供Hibernate的缓存实现
1.3 Ehcache的类层次模型:
Ehcache的类层次模型主要为三层,最上层的是CacheManager,他是操作Ehcache的入口。我们可以通过CacheManager.getInstance()获得一个单个的CacheManager,或者通过CacheManager的构造函数创建一个新的CacheManager。每个CacheManager都管理着多个Cache。而每个Cache都以一种类Hash的方式,关联着多个Elemenat。而Element则是我们用于存放要缓存内容的地方。事件处理:可以为CacheManager添加事件监听,当对CacheManager增删Cache时,事件处理器将会得到通知。要配置事件处理,需要通过ehcache的配置文件来完成。
可以为Cache添加事件监听,当对Cache增删Element时,事件处理器将会得到通知。要配置事件处理,需要通过ehcache的配置文件来完成。
1.4 ehcache的刷新策略
ehcache的刷新策略是当缓存在放入的时候记录一个放入时间,它是用Lazy Evict的方式,在取的时候同设置的TTL比较
1.5 ehcache缓存的3种清空策略:
1 FIFO,先进先出
2 LFU,最少被使用,缓存的元素有一个hit属性,hit值最小的将会被清出缓存。
3 LRU,最近最少使用的,缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。
1.6 ehcache参数配置:
maxInMemory - 设定内存中创建对象的最大值。
eternal - 设置元素(译注:内存中对象)是否永久驻留。如果是,将忽略超时限制且元素永不消亡。
timeToIdleSeconds - 设置某个元素消亡前的停顿时间。也就是在一个元素消亡之前,两次访问时间的最大时间间隔值。这只能在元素不是永久驻留时有效(译注:如果对象永恒不灭,则设置该属性也无用)。
如果该值是 0 就意味着元素可以停顿无穷长的时间。
timeToLiveSeconds - 为元素设置消亡前的生存时间。也就是一个元素从构建到消亡的最大时间间隔值。这只能在元素不是永久驻留时有效。
overflowToDisk - 设置当内存中缓存达到maxInMemory 限制时元素是否可写到磁盘上。
1.7 Ehcache结构图如下:
1.8 Ehcache详细结构图如下:
1.9 Ehcache的加载模块列表,他们都是独立的库,每个都为Ehcache添加新的功能,可以在此下载 :
- ehcache-core:API,标准缓存引擎,RMI复制和Hibernate支持
- ehcache:分布式Ehcache,包括Ehcache的核心和Terracotta的库
- ehcache-monitor:企业级监控和管理
- ehcache-web:为Java Servlet Container提供缓存、gzip压缩支持的filters
- ehcache-jcache:JSR107 JCACHE的实现
- ehcache-jgroupsreplication:使用JGroup的复制
- ehcache-jmsreplication:使用JMS的复制
- ehcache-openjpa:OpenJPA插件
- ehcache-server:war内部署或者单独部署的RESTful cache server
- ehcache-unlockedreadsview:允许Terracotta cache的无锁读
- ehcache-debugger:记录RMI分布式调用事件
- Ehcache for Ruby:Jruby and Rails支持
2.0 Ehcache配置:
ehcache 的配置可以通过在 XML文件中声明,或者通过构造函数中指定参数进行程序控制。
两种方法都能很好的支持。不过将缓存的配置和实际代码分离开来更好一些,这有以下几个好处:
便于在一个地方保存所有的配置信息
缓存使用内存或磁盘空间需要仔细调整和规划,你可以在一个配置文件中获取所有信息。当然你也可以都在代码中搞定,但检查起来就没那么方便。
便于在部署时修改缓存的配置
配置错误便于在启动时被发现,以免在运行时才暴露出错误
如果存在一个缺省配置,那么它总是会被装载并生效
虽然缺省配置不是必需的,但如果没有加载缺省配置,以编程方式创建命名cance(created by name) 就会产生错误。
动态修改缓存配置
缓存服务启动之后,其配置一般不能再改变。但从 ehcache2.0之后,特定的缓存配置参数可以在运行时动态修改。在当前版本的ehcache,中包含以下几个参数。
timeToLive
一个被缓存的对象(Element)保存在缓存中的最大秒数,无论其是否被使用。超过这个时间限制,该对象将无法从缓存中获取。默认值是0,表示没有限制。
timeToIdle
一个被缓存的对象(Element)保存在缓存中未被访问的最大秒数。超过这个时间限制,该对象将无法从缓存中获取。默认值是0,表示没有限制。
本地缓存参数 maxEntriesLocalHeap, maxBytesLocalHeap, maxBytesLocalOffHeap, maxEntriesLocalDisk, maxBytesLocalDisk.
memory-store eviction policy (内存驱逐策略)
CacheEventListeners 可以动态增或删除
注意Cache 的 "eternal" (永恒)属性,如果设置为true,重置 "timeToLive" 和 timeToIdle" 就都没用了,任何对象都不会过期。
下面的例子演示如何动态修改使用中的缓存。
Cache cache = manager.getCache("sampleCache");
CacheConfiguration config = cache.getCacheConfiguration();
config.setTimeToIdleSeconds(60);
config.setTimeToLiveSeconds(120);
config.setmaxEntriesLocalHeap(10000);
config.setmaxEntriesLocalDisk(1000000);
缓存参数也可以被冻结,防止修改:
Cache cache = manager.getCache("sampleCache");
cache.disableDynamicFeatures();
在 ehcache.xml中,将<ehcache>的dynamicConfig 属性设置为"false", 可以禁止动态修改缓存参数
动态修改分布式缓存配置
和独立缓存一样,操纵分布式缓存的配置也需要通过cache.getCacheConfiguration()方法获得 CacheConfiguration 对象,通过它的一系列 set 方法进行修改。
下表提供了如何动态修改一个Terracotta 集群的公共配置选项的一些信息。表头的"Scope"字段表示配置的变更能够在哪里生效,可以是以下几个值。
Client – The Terracotta client where the CacheManager runs.
TSA – The Terracotta Server Array for the cluster.
BOTH – Both the client and the TSA.
注意 "Both" 是分布式含义,也就是说对所有客户端都会生效
2.1 Ehcache 和 Redis 比较如下
Ehcache | Redis | |
存取速度 | Ehcache直接在jvm虚拟机中缓存,速度快,效率高 | Redis是通过socket访问到缓存服务,效率比ecache低 |
集群和分布式 | Ehcache有缓存共享方案,不过是通过RMI或者Jgroup多播方式进行广播缓存通知更新,缓存共享复杂,维护不方便;简单的共享可以,但是涉及到缓存恢复,大数据缓存,则不合适。 | Redis有成熟的分布式解决方案。适合大规模分布式集群部署。 |
操作复杂度 | Ehcache提供的接口非常简单明了,从Ehcache的搭建到运用运行仅仅需要的是你宝贵的几分钟。其实很多开发者都不知道自己用在用Ehcache,Ehcache被广泛的运用于其他的开源项目。比如:Hibernate | 至少需要安装服务端和客户端才能使用。操作略比Ehcache复杂一些。 |
2019-06-2500:13:06
缓存利器之Ehcache的更多相关文章
- Win下必备利器之Cmder
诚言,对于开发码字者,Mac和Linux果断要比Windows更贴心;但只要折腾下,Windows下也是有不少利器的.之前就有在Windows下效率必备软件一文中对此做了下记载:其虽没oh-my-zs ...
- C#编程利器之二:结构与枚举(Structure and enumeration)【转】
C#编程利器之二:结构与枚举(Structure and enumeration) 在上一篇文章中,介绍了类如何封装程序中的对象.而实际中,出了类可以封装对象外,结构和枚举也可以封装一些对象,本文将着 ...
- 大数据并行计算利器之MPI/OpenMP
大数据集群计算利器之MPI/OpenMP ---以连通域标记算法并行化为例 1 背景 图像连通域标记算法是从一幅栅格图像(通常为二值图像)中,将互相邻接(4邻接或8邻接)的具有非背景值的像素集合提取出 ...
- Mybatis第八篇【一级缓存、二级缓存、与ehcache整合】
Mybatis缓存 缓存的意义 将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题. myba ...
- Spring Boot Oauth2缓存UserDetails到Ehcache
在Spring中有一个类CachingUserDetailsService实现了UserDetailsService接口,该类使用静态代理模式为UserDetailsService提供缓存功能.该类源 ...
- php调试利器之phpdbg
信海龙的博客 php调试利器之phpdbg 简介 PHPDBG是一个PHP的SAPI模块,可以在不用修改代码和不影响性能的情况下控制PHP的运行环境. PHPDBG的目标是成为一个轻量级.强大.易用的 ...
- java-mybaits-00602-查询缓存-mybatis整合ehcache
ehcache是一个分布式缓存框架.EhCache 是一个纯Java的进程内缓存框架,是一种广泛使用的开源Java分布式缓存,具有快速.精干等特点,是Hibernate中默认的CacheProvide ...
- 后台任务利器之Hangfire
后台任务利器之Hangfire 一.简述 Hangfire作为一款高人气且容易上手的分布式后台执行服务,支持多种数据库.在.net core的环境中,由Core自带的DI管理着生命周期,免去了在NF4 ...
- Android开发利器之ActivityTracker
版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/113 Android开发利器之ActivityTracke ...
随机推荐
- Python3条件判断
if语句: Python中if语句的一般形式如下: if condition_1: statement_block_1 elif condition_2: statement_block_2 else ...
- 数据结构实验之查找五:平方之哈希表 (SDUT 3377)
Hash表的平方探测思路:如果当前这个没存放数值,就放进去,如果当前这个地方Hash [ i ] 已经有数值了,就以平方的间隔左右寻找没有存放数的空白 Hash [ i ]. #include < ...
- shiro 配置注解异常 java.lang.ClassNotFoundException: org.aspectj.util.PartialOrder$PartialComparable
解决方案: pom 文件添加: <!-- 解决shiro注解(shiro 使用 aop) --> <dependency> <groupId>aspectj< ...
- 持续api管理翻译
- 书籍内容 > 地址: https://www.safaribooksonline.com/library/view/continuous-api-management/97814920435 ...
- json页面解析
List<TjfxDTO> cyjbList = new ArrayList<TjfxDTO>(); cyjbList=tjfxService.cyjb_wcjd(tjfxDT ...
- 构造器Constructor
构造器Constructor是否可被override构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading 首先,构造器是不能被继承的,因为每个类 ...
- java权限管理与用户角色权限设计
java权限管理与用户角色权限设计 实现业务系统中的用户权限管理 B/S系统中的权限比C/S中的更显的重要,C/S系统因为具有特殊的客户端,所以访问用户的权限检测可以通过客户端实现或通过客户端+服务器 ...
- js 检测链接是否有效(包含跨域)
const checkUrl = function (url) { const promise = new Promise(function (resolve, reject) { if (!url) ...
- java spark list 转为 RDD 转为 dataset 写入表中
package com.example.demo; import java.util.ArrayList; import java.util.Arrays; import java.util.Hash ...
- lua 求table长度和判断空
local table_a = {} 判断一:(错误方法) if table_a == {} then --你会发现你怎么也进不来 条件判断始终返回false,为什么会这样呢? ...