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),但本身不直接提供缓存功能.它支持注解方式使用缓存, 非常方便

特性

  1. 简单快速
  2. 多级缓存策略,内存和硬盘,因此无需担心缓存容量问题
  3. 缓存数据会在虚拟机重启的过程中写入磁盘
  4. 可以通过RMI,可插入AOI等方式进行分部署缓存
  5. 具有缓存和缓存管理器侦听接口
  6. 支持多缓存管理器实例,以及一个实例的多个缓存区域
  7. 可以单独使用,一般在第三方库中被用到的比较多(如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做的

Last modification:February 8, 2023
如果觉得我的文章对你有用,请随意赞赏