Ehcahce
特点
快速轻量
过去几年,众多测试表明ehcache是最快的java缓存之一,ehcahce的线程机制是为大型高并发系统设计的,大量性能测试用例保证ehcache在不同版本性能表现一致,很多用户都不知道他们正在用ehcache,因此不需要什么特别的配置,api易于使用,这就很容易部署到线上运行
伸缩性
缓存在内存和硬盘存储可以伸缩到数G,Ehcache为大数据存储做过优化,大内存情况下,所有进程可以支持数百G的吞吐,为高并发和大型多CPU服务器做优化,线程安全和性能总是一些矛盾,ehcache的线程机制采用了doug lea的想法来获取比较高的性能,单台虚拟机上支持多缓存管理器,通过terracotta服务矩阵,可以伸缩扩容到数百个节点
应用场景
单个应用或者对缓存要求很高的应用
简单的共享可以,但是涉及到缓存恢复,大数据缓存,则不合适
大型系统,存在缓存共享,分布式部署,缓存内容很大的不适合使用
淘汰策略
Ehcache 过期数据淘汰机制:即懒淘汰机制,每次往缓存放入数据的时候,都会存一个时间,在读取的时候要和设置的时间做 TTL 比较来判断是否过期
介绍
基本
Ecache是纯java进程内缓存框架,具有快速,精干等特点是hibernate中默认的cacheprovider.Ecache是一种广泛的开源java分布式缓存.主要面向通用缓存,javaEE和轻量级容器.它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个gzip缓存servlet过滤器,支持rest和SOAP apo等特点
spring提供了对缓存功能的抽象:即允许绑定不同的缓存方案(如Ehcache),但本身不直接提供缓存功能.它支持注解方式使用缓存, 非常方便
特性
- 简单快速
- 多级缓存策略,内存和硬盘,因此无需担心缓存容量问题
- 缓存数据会在虚拟机重启的过程中写入磁盘
- 可以通过RMI,可插入AOI等方式进行分部署缓存
- 具有缓存和缓存管理器侦听接口
- 支持多缓存管理器实例,以及一个实例的多个缓存区域
- 可以单独使用,一般在第三方库中被用到的比较多(如mybatis、shiro等)ehcache 对分布式支持不够好,多个节点不能同步,通常和redis一块使用
和redis比较
ehcahce直接在jvm虚拟机缓存中,速度快,效率高,但是缓存共享麻烦,集群分部署应用不方便
redis是听过socket访问到缓存服务,效率比Ehcache低,比关系型数据库要快很多,处理集群和分布式缓存方便,有成熟的方案.如果是单个应用或者对缓存访问要求很高的应用,用Ehcache.如果是大型分布式系统,存在缓存共享,分布式缓存,缓存内容很大的建议用redis
ehcache也有缓存共享方案,不过是通过RMI或者Jgroup多播方式进行广播缓存通知更新,缓存共享复杂,维护不方便;简单的共享可以,但是涉及到缓存恢复,大数据缓存,则不合适.
使用教程
pom文件
<!-- ehcache依赖 -->
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>2.10.6</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
创建Ehcache的配置文件 ehcache.xml
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">
<!--
磁盘存储:将缓存中暂时不使用的对象,转移到硬盘,类似于Windows系统的虚拟内存
path:指定在硬盘上存储对象的路径
path可以配置的目录有:
user.home(用户的家目录)
user.dir(用户当前的工作目录)
java.io.tmpdir(默认的临时目录)
ehcache.disk.store.dir(ehcache的配置目录)
绝对路径(如:d:\\ehcache)
查看路径方法:String tmpDir = System.getProperty("java.io.tmpdir");
-->
<diskStore path="java.io.tmpdir" />
<!--
defaultCache:默认的缓存配置信息,如果不加特殊说明,则所有对象按照此配置项处理
maxElementsInMemory:设置了缓存的上限,最多存储多少个记录对象
eternal:代表对象是否永不过期 (指定true则下面两项配置需为0无限期)
timeToIdleSeconds:最大的发呆时间 /秒
timeToLiveSeconds:最大的存活时间 /秒
overflowToDisk:是否允许对象被写入到磁盘
说明:下列配置自缓存建立起600秒(10分钟)有效 。
在有效的600秒(10分钟)内,如果连续120秒(2分钟)未访问缓存,则缓存失效。
就算有访问,也只会存活600秒。
-->
<defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="600"
timeToLiveSeconds="600" overflowToDisk="true" />
<!--
maxElementsInMemory,内存缓存中最多可以存放的元素数量,若放入Cache中的元素超过这个数值,则有以下两种情况
1)若overflowToDisk=true,则会将Cache中多出的元素放入磁盘文件中
2)若overflowToDisk=false,则根据memoryStoreEvictionPolicy策略替换Cache中原有的元素
eternal, 缓存中对象是否永久有效
timeToIdleSeconds, 缓存数据在失效前的允许闲置时间(单位:秒),仅当eternal=false时使用,默认值是0表示可闲置时间无穷大,若超过这个时间没有访问此Cache中的某个元素,那么此元素将被从Cache中清除
timeToLiveSeconds, 缓存数据的总的存活时间(单位:秒),仅当eternal=false时使用,从创建开始计时,失效结束
maxElementsOnDisk, 磁盘缓存中最多可以存放的元素数量,0表示无穷大
overflowToDisk, 内存不足时,是否启用磁盘缓存
diskExpiryThreadIntervalSeconds, 磁盘缓存的清理线程运行间隔,默认是120秒
memoryStoreEvictionPolicy, 内存存储与释放策略,即达到maxElementsInMemory限制时,Ehcache会根据指定策略清理内存 共有三种策略,分别为LRU(最近最少使用)、LFU(最常用的)、FIFO(先进先出)
-->
<cache name="user"
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
maxElementsOnDisk="10000000"
overflowToDisk="true"
memoryStoreEvictionPolicy="LRU" />
</ehcache>
常用的memoryStoreEvictionPolicy缓存算法
LRU:新来的对象替换掉使用时间算最近最少使用的对象
LFU:替换掉命中率低算比较低的对象
FIFO:最早进入耳机缓存的对象替换掉
<cache name="user"></cache>
,我们是可以配置多个来解决我们不同业务处所需要的缓存策略的
默认情况下,EhCache 的配置文件名是固定的,ehcache.xml,如果需要更改文件名,需要在 application.yml 文件中指定配置文件位置,如:
spring:
cache:
type: ehcache
ehcache:
config: classpath:/ehcache.xml
制定了EhCache的配置文件位置
开启缓存的方式也和redis一样,在启动类上添加@EnableCaching注解即可
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@SpringBootApplication
@EnableCaching
public class SbmApplication {
public static void main(String[] args) {
SpringApplication.run(SbmApplication.class, args);
}
}
使用方式也和redis一样,因为都可以用springcache做的