【SpringBoot19】SpringBoot中整合Ehcache实现热点数据缓存

2023-05-16

EhCache 是一个纯 Java 的进程内缓存框架,具有快速、精干等特点,是 Hibernate 中默认的 CacheProvider。用惯了 Redis,很多人可能已经忘记了还有 EhCache 这么一个缓存框架

一、简介
EhCache 是一个纯 Java 的进程内缓存框架,具有快速、精干等特点,是 Hibernate 中默认CacheProvider。Ehcache 是一种广泛使用的开源 Java 分布式缓存。主要面向通用缓存,Java EE 和轻量级容器。它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个 gzip 缓存 servlet 过滤器,支持 REST 和 SOAP api 等特点。

特性
快速、简单
多种缓存策略
缓存数据有两级:内存和磁盘,因此无需担心容量问题
缓存数据会在虚拟机重启的过程中写入磁盘
可以通过RMI、可插入API等方式进行分布式缓存
具有缓存和缓存管理器的侦听接口
支持多缓存管理器实例,以及一个实例的多个缓存区域
提供Hibernate的缓存实现
与 Redis 相比
EhCache 直接在jvm虚拟机中缓存,速度快,效率高;但是缓存共享麻烦,集群分布式应用不方便。
Redis 是通过 Socket 访问到缓存服务,效率比 EhCache 低,比数据库要快很多,处理集群和分布式缓存方便,有成熟的方案。如果是单个应用或者对缓存访问要求很高的应用,用 EhCache 。如果是大型系统,存在缓存共享、分布式部署、缓存内容很大的,建议用 Redis。
EhCache 也有缓存共享方案,不过是通过 RMI 或者 Jgroup 多播方式进行广播缓存通知更新,缓存共享复杂,维护不方便;简单的共享可以,但是涉及到缓存恢复,大数据缓存,则不合适。
二、引入 EhCache
1、引入依赖
在 pom.xml 文件中,引入 Ehcache 的依赖信息

<!-- 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>


2、配置文件
创建 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>


<cache name="user"></cache>,我们是可以配置多个来解决我们不同业务处所需要的缓存策略的

默认情况下,EhCache 的配置文件名是固定的,ehcache.xml,如果需要更改文件名,需要在 application.yml 文件中指定配置文件位置,如:

spring:
  cache:
    type: ehcache
    ehcache:
      config: classpath:/ehcache.xml


指定了 EhCache 的配置文件位置

3、开启缓存
开启缓存的方式,也和 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);
    }
}


三、开始使用
1、@CacheConfig
这个注解在类上使用,用来描述该类中所有方法使用的缓存名称,当然也可以不使用该注解,直接在具体的缓存注解上配置名称,示例代码如下:

@Service
@CacheConfig(cacheNames = "user")
public class UserServiceImpl implements UserService {

}


2、@Cacheable
这个注解一般加在查询方法上,表示将一个方法的返回值缓存起来,默认情况下,缓存的 key 就是方法的参数,缓存的 value 就是方法的返回值。示例代码如下:

@Override
@Cacheable(value = "user", key = "#id")
public User getUserById(Long id) {
    return userMapper.getUserById(id);
}


如果在类上没有加入 @CacheConfig,我们则需要使用 value 来指定缓存名称
这里如果需要多个 key 时,需要使用 “:” 来连接,如:

@Cacheable(value = "user", key = "#name+':'+#phone")


3、@CachePut
这个注解一般加在更新方法上,当数据库中的数据更新后,缓存中的数据也要跟着更新,使用该注解,可以将方法的返回值自动更新到已经存在的 key 上,示例代码如下:

@Override
@CachePut(value = "user", key = "#id")
public User updateUserById(User user) {
    return userMapper.updateUserById(user);
}


4、@CacheEvict
这个注解一般加在删除方法上,当数据库中的数据删除后,相关的缓存数据也要自动清除,该注解在使用的时候也可以配置按照某种条件删除( condition 属性)或者或者配置清除所有缓存( allEntries 属性),示例代码如下:

@Override
@CacheEvict(value = "user", key = "#id")
public void deleteUserById(Long id) {
    userMapper.deleteUserById(id);
}


四、总结
SpringBoot 中使用 Ehcache 比较简单,只需要简单配置,说白了还是 Spring Cache 的用法,合理使用缓存机制,可以很好地提高项目的响应速度。
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【SpringBoot19】SpringBoot中整合Ehcache实现热点数据缓存 的相关文章

  • centos安装lspci工具

    背景 由于centos6 3迷你安装版上没有带lspci工具 在定制内核时 无法用此工具查询硬件相关信息 具体步骤如下 1 下载 pci包 xff1a http www kernel org pub software utils pciut
  • 软件性能测试方法论

    软件性能测试过程详解与案例分析 xff08 段念 编著 xff09 学习笔记三 1 SEI负载测试计划过程 SEI load Testing Planning Process是一个关注于负载测试计划的方法 xff0c 其目标是产生 清晰 易
  • 2011年总结&2012年展望

    再有几天就2012了 xff0c 工作三年多了 xff0c 之前也没写过总结 xff0c 感觉总结这东西写写也挺好的 xff0c 可以思考下过去和未来 xff0c 留个底 xff0c 可以作为日后的对比 xff1b 总结我的2011年 xf
  • Linux查看端口使用状态、关闭端口方法

    前提 xff1a 首先你必须知道 xff0c 端口不是独立存在的 xff0c 它是依附于进程的 某个进程开启 xff0c 那么它对应的端口就开启了 xff0c 进程关闭 xff0c 则该端口也就关闭了 下次若某个进程再次开启 xff0c 则
  • 查找列表中某个值的位置(python)

    p 61 list index value list为列表的名字 value为查找的值 p为value在list的位置 以下内容引自 xff1a http www linuxidc com Linux 2012 01 51638 htm P
  • python 等待一定时间后继续执行其后的程序

    简单示例 xff1a import time print 39 11 39 time sleep 10 print 39 22 39 先打印11 xff0c 等待10秒后 xff0c 打印22
  • Linux下用于查看系统当前登录用户信息的4种方法

    作为系统管理员 xff0c 你可能经常会 xff08 在某个时候 xff09 需要查看系统中有哪些用户正在活动 有些时候 xff0c 你甚至需要知道他 xff08 她 xff09 们正在做什么 本文为我们总结了4种查看系统用户信息 xff0
  • TCP:三次握手,URG、ACK、PSH、RST、SYN、FIN 含义

    TCP SYN ACK FIN RST PSH URG简析 三次握手Three way Handshake 一个虚拟连接的建立是通过三次握手来实现的 1 B gt SYN gt A 假如服务器A和客户机B通讯 当A要和B通信时 xff0c
  • [转载]一次 JMeter 脚本请求错误 HTTP Status 415 的解决笔记

    录制好脚本以后 xff0c 使用 JMeter 打开 xff0c 直接运行测试 xff0c 发现有个 Ajax 提交表单的时候出错了 服务器返回信息如下 xff1a HTTP Status 415 type Status report me
  • python list转换字符串报错TypeError: sequence item 0: expected str instance, int found

    今天敲小例子 xff0c 报了错TypeError sequence item 0 expected str instance int found 小例子 xff1a list1 61 1 39 two 39 39 three 39 4 p
  • Linux下使用 xrandr 命令设置屏幕分辨率

    最近在Linux下修改屏幕分辨率的时候 xff0c 发现了一个非常有用的命令 xff1a xrandr 使用这个命令 xff0c 可以方便的设置您显示器的的分辨率 尤其是当你使用了一些需要或者会自动改动您屏幕分辨率的程序以后 您可以使用如下
  • windows7触屏编程

    每当用户触摸触敏式 Windows 7 设备时 xff0c Windows 7 多点触控平台都会向您的应用程序发送手势消息 WM GESTURE 这是现成的免费行为 xff0c 如果您希望停止接收此类消息 xff0c 则需要选择退出 手势被
  • 工业级串口Modbus数据绘制曲线及上位机监控软件DotTrend

    工业级串口Modbus数据绘制曲线及上位机监控软件DotTrend 1 软件概述 DotTrend是一款全新设计开发的软件 xff08 原创 xff09 xff0c 理论上可用于监控所有遵守Modbus标准协议的设备 xff0c 便于开发
  • 串口设备模拟器DevSimulate

    万能串口设备模拟器 DevSimulate xff08 支持Modbus及自定义协议 xff09 DevSimulate是一款可以在电脑上模拟一个或多个从设备的串口工具软件 xff0c 并且可以通过设计数学公式对任意点位进行逻辑关系的自定义
  • 工业级串口Modbus曲线记录监控工具——DotTrend

    工业级串口Modbus数据曲线记录监控工具 DotTrend 1 软件版本更新 自Modbus点位数据监控曲线DotTrend推出以来 xff0c 极大方便了工程技术人员的日常研发与测试工作 xff0c 广泛受到了社会同行的一致好评 xff
  • DotTrend使用说明手册

    DotTrend使用说明手册 1 DotTrend建立通信与绘制曲线2 工程打开与保存3 历史曲线保存与打开4 曲线导出excel文件 传统的串口工具大多只能查看16进制的通信数据 xff0c 想看十进制恐怕要自己算了 xff1b 即使有的
  • Modbus串口设备模拟器-DevSimulate(Slave+自定义逻辑)

    串口Modbus设备模拟器 DevSimulate DevSimulate是一款可以在电脑上模拟一个或多个从设备的串口工具软件 xff0c 并且可以通过设计数学公式对任意点位进行逻辑关系的自定义 即实现Slave 43 用户自定义逻辑功能
  • 串口Modbus从设备模拟器-DevSimulate

    1 项目场景 xff1a 例如 xff1a 项目场景 xff1a 兹有西门子PLC控制器一台 xff0c 需要控制四方变频器VFD xff0c 来带动三相交流电机作加速 xff08 频率递增 xff09 xff0c 保持 xff08 频率保
  • 解直线方程小软件

    解直线方程软件 软件说明 自己写的一个求解直线方程的小软件 xff0c 例如知道两点的xy坐标 xff0c 可以求得该直线的k值 xff0c b值 给点任意一点的x坐标 xff0c 可以求得该点的y坐标 反过来也可以求已知直线上的任意一点
  • ROS学习笔记(一):在ROS中使用USB网络摄像头传输图像

    在现实中 xff0c 我们一般是使用摄像头来获取图像 xff0c 这次要实现在ROS中使用摄像头传输图像 xff0c 我使用的是usb网络摄像头 xff08 不需要驱动 xff0c 我使用的是不需要驱动的usb摄像头 xff09 xff0c

随机推荐