当前位置: 首页 > news >正文

Java程序设计:spring boot(11)——分布式缓存 Ehcache 整合

     

目录

1 Spring Cache 相关注解说明

1.1 @CacheConfig

1.2 @Cacheable

1.3 @CachePut

1.4 @CacheEvict

1.5 @Caching

2 环境配置

2.1 pom.xml 依赖添加

2.2 ehcahe.xml ⽂件添加

2.3 application.yml 缓存配置

2.4 启动缓存

2.5 JavaBean 对象实现序列化

3 缓存实现

3.1 用户详情查询缓存

3.2 用户列表查询缓存

3.3 用户更新&删除缓存


       EhCache 是⼀个⽐较成熟的 Java 缓存框架,最早从 hibernate 发展⽽来, 是进程中的缓存系统,它提供了⽤内存,磁盘⽂件存储,以及分布式存储⽅式等多种灵活的 cache 管理⽅案,快速简单。

       Spring Boot 对 Ehcache 的使⽤提供⽀持,所以在 Spring Boot 中只需简单配置即可使⽤ Ehcache 实现数据缓存处理。

1 Spring Cache 相关注解说明

       SpringBoot 缓存实现内部使⽤ SpringCache 实现缓存控制,这⾥集成 Ehcache 实际上是对 SpringCache 抽象的其中⼀种实现,这⾥在使⽤ Ehcache 实现缓存控制时相关注解说明如下。

1.1 @CacheConfig

       ⽤于标注在类上,可以存放该类中所有缓存的公有属性,⽐如设置缓存的名字。

@CacheConfig(cacheNames = "users")
public interface UserService {。。。}

       配置了该数据访问对象中返回的内容将存储于名为users的缓存对象中,我们也可以不使⽤该注解, 直接通过@Cacheable⾃⼰配置缓存集的名字来定义。

1.2 @Cacheable

       应⽤到读取数据的⽅法上,即可缓存的⽅法,如查找⽅法,先从缓存中读取,如果没有再调⽤相应⽅ 法获取数据,然后把数据添加到缓存中。

该注解主要有下⾯⼏个参数:

value、cacheNames:两个等同的参数( cacheNames 为 Spring 4 新增,作为 value 的别 名),⽤于指定缓存存储的集合名。由于 Spring 4 中新增了 @CacheConfig,因此在 Spring 3 中 原本必须有的 value 属性,也成为⾮必需项了。

key:缓存对象存储在Map集合中的 key 值,⾮必需,缺省按照函数的所有参数组合作为 key 值, 若⾃⼰配置需使⽤ SpEL 表达式,⽐如:@Cacheable(key = "#p0"):使⽤函数第⼀个参数作为缓 存的 key 值,更多关于SpEL 表达式的详细内容可参考官⽅⽂档。

condition:缓存对象的条件,⾮必需,也需使⽤SpEL表达式,只有满⾜表达式条件的内容才会被 缓存,⽐如:@Cacheable(key = "#p0", condition = "#p0.length() < 3"),表示只有当第⼀个参数 的⻓度⼩于3的时候才会被缓存。

unless:另外⼀个缓存条件参数,⾮必需,需使⽤ SpEL 表达式。它不同于 condition 参数的地⽅ 在于它的判断时机,该条件是在函数被调⽤之后才做判断的,所以它可以通过对 result 进⾏判 断。

keyGenerator:⽤于指定 key ⽣成器,⾮必需。若需要指定⼀个⾃定义的 key ⽣成器,我们需要 去实现org.springframework.cache.interceptor.KeyGenerator 接⼝,并使⽤该参数来指定。需 要注意的是:该参数与 key 是互斥的。

cacheManager:⽤于指定使⽤哪个缓存管理器,⾮必需。只有当有多个时才需要使⽤ cacheResolver:⽤于指定使⽤那个缓存解析器,⾮必需。需通过 org.springframework.cache. interceptor.CacheResolver 接⼝来实现⾃⼰的缓存解析器,并⽤该 参数指定。

@Cacheable(value = "user", key = "#id")
User selectUserById(final Integer id);

1.3 @CachePut

应⽤到写数据的⽅法上,如新增/修改⽅法,调⽤⽅法时会⾃动把相应的数据放⼊缓存,@Cache Put的参数与 @Cacheable 类似,示例如下:

@CachePut(value = "user", key = "#user.id") 
public User save(User user) { users.add(user); return user; 
} 

1.4 @CacheEvict

应⽤到移除数据的⽅法上,如删除⽅法,调⽤⽅法时会从缓存中移除相应的数据,示例如下:

@CacheEvict(value = "user", key = "#id")
void delete(final Integer id);

除了同 @Cacheable ⼀样的参数之外,@CacheEvict 还有下⾯两个参数:

allEntries:⾮必需,默认为 false。当为 true 时,会移除所有数据

beforeInvocation:⾮必需,默认为 false,会在调⽤⽅法之后移除数据。当为 true 时,会在调 ⽤⽅法之前移除数据。

1.5 @Caching

组合多个 Cache 注解使⽤。示例:

@Caching(put = {@CachePut(value = "user", key = "#user.id"),@CachePut(value = "user", key = "#user.username"),@CachePut(value = "user", key = "#user.age")}
}

将 id ---> user;username ---> user;age ---> user 进⾏缓存。

2 环境配置

2.1 pom.xml 依赖添加

<!-- Ehcache -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency><groupId>net.sf.ehcache</groupId><artifactId>ehcache</artifactId>
</dependency>

2.2 ehcahe.xml ⽂件添加

src/main/resources ⽬录下添加 ehcache.xml ⽂件,内容如下:

<ehcache name="mycache"><!--如果不使⽤磁盘存储,只需要将diskStore注释掉即可;如果使⽤,需要在ehcache.xml⽂件中的ehcahce元素下的定义⼀个diskStore元素并指定其path
属性。--><diskStore path="C:\java\cache"/><!--name:缓存名称。maxElementsInMemory:缓存最⼤数⽬maxElementsOnDisk:硬盘最⼤缓存个数。eternal:对象是否永久有效,⼀但设置了,timeout将不起作⽤。overflowToDisk:是否保存到磁盘,当系统宕机时timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使⽤,可选属性,默认值是0,表示可闲置时间⽆
穷⼤。timeToLiveSeconds:设置对象在失效前允许存活时间(单位:秒)。最⼤时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使⽤,默认是0,也就是对象存活时间⽆穷⼤。diskPersistent:是否缓存虚拟机重启期数据Whether the disk store persists between restarts of the Virtual Machine. 
The default value is false.diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区⼤⼩。默认是30MB。每个Cache都应该有⾃⼰的⼀个缓冲区。diskExpiryThreadIntervalSeconds:磁盘失效线程运⾏时间间隔,默认是120秒。memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,会根据指定的策略
去清理内存默认策略是LRU(最近最少使⽤)。你可以设置为FIFO(先进先出)或是LFU(较少使
⽤)。clearOnFlush:内存数量最⼤时是否清除。memoryStoreEvictionPolicy:可选策略有:LRU(最近最少使⽤,默认策略)Less Frequently Used,就是例⼦中使⽤的策略,就是⼀直以来最少被使⽤的。FIFO(先进先出)first in first out,这个是⼤家最熟的,先进先出。LFU(最少访问次数)Least Recently Used,最近最少使⽤的。缓存的元素有⼀个时间戳,当缓存容量满了,⽽⼜需要腾出地⽅来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。--><defaultCachemaxElementsInMemory="10000"eternal="false"timeToIdleSeconds="120"timeToLiveSeconds="120"maxElementsOnDisk="10000000"diskExpiryThreadIntervalSeconds="120"memoryStoreEvictionPolicy="LRU"></defaultCache><cachename="users"eternal="false"maxElementsInMemory="100"overflowToDisk="false"diskPersistent="false"timeToIdleSeconds="0"timeToLiveSeconds="300"memoryStoreEvictionPolicy="LRU"/>
</ehcache>

2.3 application.yml 缓存配置

spring:datasource:type: com.mchange.v2.c3p0.ComboPooledDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/springboot_mybatis?
useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8username: rootpassword: rootdevtools:restart:enabled: true# 设置重启的⽬录,添加⽬录的⽂件需要restartadditional-paths: src/main/java# 解决项⽬⾃动重新编译后接⼝报404的问题poll-interval: 3000quiet-period: 1000## Ehcache缓存配置cache:ehcache:config: classpath:ehcache.xml

2.4 启动缓存

在 Starter 启动⼊⼝类中,添加 @EnableCaching 注解,启动缓存:

@SpringBootApplication
@EnableCaching
@MapperScan("com.xxxx.springboot.dao")
public class Starter {public static void main(String[] args) {SpringApplication.run(Starter.class);}
}

2.5 JavaBean 对象实现序列化

@ApiModel(description = "⽤户实体对象")
public class User implements Serializable {@ApiModelProperty(value = "⽤户id")private Integer id;@ApiModelProperty(value = "⽤户名")private String userName;@ApiModelProperty(value = "⽤户密码")private String userPwd;/*省略get|set*/
}

3 缓存实现

       以 UserService 的⽅法为例

3.1 用户详情查询缓存

@Cacheable(value = "users",key = "#userId")
public User queryUserByUserId(Integer userId){return userMapper.queryById(userId);
}

3.2 用户列表查询缓存

@Cacheable(value = "users",key="#userQuery.userName+'-'+#userQuery.pageNum+'-
'+#userQuery.pageSize")
public PageInfo<User> queryUserByParams(UserQuery userQuery){PageHelper.startPage(userQuery.getPageNum(),userQuery.getPageSize());return new PageInfo<User>(userMapper.selectByParams(userQuery));
}

3.3 用户更新&删除缓存

@CacheEvict(value = "users",key="#user.id")
public void updateUser(User user) {AssertUtil.isTrue(StringUtils.isBlank(user.getUserName()), "⽤户名不能为
空!");AssertUtil.isTrue(StringUtils.isBlank(user.getUserPwd()),"⽤户密码不能为
空!");User temp = userMapper.queryUserByUserName(user.getUserName());AssertUtil.isTrue(null != temp && !(temp.getId().equals(user.getId())), "该
⽤户已存在!");AssertUtil.isTrue(userMapper.update(user)<1,"⽤户记录添加失败!");
}
@CacheEvict(value = "users",allEntries=true)
public void deleteUser(Integer userId){AssertUtil.isTrue(null == userId || null ==
userMapper.queryById(userId),"待删除记录不存在!");AssertUtil.isTrue(userMapper.delete(userId)<1,"⽤户删除失败!");
}

相关文章:

Java程序设计:spring boot(11)——分布式缓存 Ehcache 整合

目录 1 Spring Cache 相关注解说明 1.1 CacheConfig 1.2 Cacheable 1.3 CachePut 1.4 CacheEvict 1.5 Caching 2 环境配置 2.1 pom.xml 依赖添加 2.2 ehcahe.xml ⽂件添加 2.3 application.yml 缓存配置 2.4 启动缓存 2.5 JavaBean 对象实现序列化 3 缓存实现 3.…...

豆包,攻克数字是个什么工具?《GKData-挖掘数据的无限可能》(数据爬虫采集工具)

豆包&#xff0c;攻克数字是个什么工具&#xff1f; “攻克数字” 指的是 “攻克数字&#xff08;GKData&#xff09;” 这样一款工具。是一款针对网页、APP中数据自动解析转表存入数据库的软件&#xff0c;为数据工作者而生。它是一个不会编程也能用的可视化数据解析为标准二…...

说一说QWidget

目录 关于QWidget 作为界面组件时&#xff0c;你需要有印象的 1. 控制属性 2. 组件状态与交互属性 3. 外观和样式属性 4. 布局与子组件管理属性 5. 图标和光标属性 6. 大小策略属性 作为单独的窗体的属性 写Qt快两年了&#xff0c;也写过一些规模偏大的软件&#xff0c…...

Web3.0技术入门

Web3.0技术入门是一个涉及多个方面和领域的复杂过程&#xff0c;以下是一些关键的步骤和要点&#xff0c;帮助您初步了解并掌握Web3.0技术。 一、了解Web3.0的基本概念 Web3.0也被称为下一代互联网&#xff0c;它是对当前互联网&#xff08;Web2.0&#xff09;的演进和升级。…...

spygalss cdc 检测的bug(二)

当allow_qualifier_merge设置为strict的时候&#xff0c;sg是要检查门的极性的。 如果qualifier和src经过与门汇聚&#xff0c;在同另一个src1信号或门汇聚&#xff0c;sg是报unsync的。 假设当qualifier为0时&#xff0c;0&&src||src1src1&#xff0c;src1无法被gat…...

集合论(ZFC)之 选择公理(Axiom of Choice)注解

直观感受&#xff08;Intuition&#xff09; 集合论&#xff08;ZFC&#xff09;中的 "C" 指的是选择公理&#xff08;Axiom of Choice&#xff09;中的"choice"。简单来说&#xff0c;对于任一非空集合 S&#xff0c;那么存在一个函数 f&#xff0c;选择出…...

JS:字符串操作

目录 1、 字符串分割 1、 字符串分割 var str "123,456,789"; console.log(str.split(,)); // ["123", "456", "789"]...

.NET 一款二进制文件转换Shellcode的工具

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…...

【CSS】——基础入门常见操作

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 一&#xff1a;CSS引入 二&#xff1a;CSS对元素进行美化 1&#xff1a;style修饰 2&#xff1a;选…...

LuaJIT源码分析(五)词法分析

LuaJIT源码分析&#xff08;五&#xff09;词法分析 lua虽然是脚本语言&#xff0c;但在执行时&#xff0c;还是先将脚本编译成字节码&#xff0c;然后再由虚拟机解释执行。在编译脚本时&#xff0c;首先需要对源代码进行词法分析&#xff0c;把源代码分解为token流。lua的toke…...

005 匿名信

005 匿名信 题目描述 电视剧《分界线》里面有一个片段&#xff0c;男主为了向警察透露案件细节&#xff0c;且不暴露自己&#xff0c;于是将报刊上的字剪下来&#xff0c;剪拼成一封匿名信。现在有一名举报人&#xff0c;希望借鉴这种方式&#xff0c;使用英文报刊完成举报操…...

聊聊Web3D 发展趋势

随着 Web 技术的不断演进&#xff0c;Web3D 正逐渐成为各行业数字化的重要方向。Web3D 是指在网页中展示 3D 内容的技术集合。近年来&#xff0c;由于 WebGL、WebGPU 等技术的发展&#xff0c;3D 内容已经能够直接在浏览器中渲染&#xff0c;为用户提供更加沉浸、互动的体验。以…...

【数据结构与算法】LeetCode: 贪心算法

文章目录 LeetCode&#xff1a; 贪心算法买卖股票的最佳时机 &#xff08;Hot100&#xff09;买卖股票的最佳时机 II跳跃游戏 &#xff08;Hot100&#xff09;跳跃游戏 II&#xff08;Hot100&#xff09;划分字母区间 &#xff08;Hot100&#xff09;分发饼干K次取反后最大化的…...

Date 日期类的实现(c++)

本文用c实现日期类 将会实现以下函数 bool operator<(const Date& d);bool operator<(const Date& d);bool operator>(const Date& d);bool operator>(const Date& d);bool operator(const Date& d);bool operator!(const Date& d);Date&…...

智能家居10G雷达感应开关模块,飞睿智能uA级别低功耗、超高灵敏度,瞬间响应快

在当今科技飞速发展的时代&#xff0c;智能家居已经逐渐成为人们生活中不可或缺的一部分。从智能灯光控制到智能家电的联动&#xff0c;每一个细节都在为我们的生活带来便利和舒适。而在众多智能家居产品中&#xff0c;10G 雷达感应开关模块以其独特的优势&#xff0c;正逐渐成…...

头歌——人工智能(机器学习 --- 决策树2)

文章目录 第5关&#xff1a;基尼系数代码 第6关&#xff1a;预剪枝与后剪枝代码 第7关&#xff1a;鸢尾花识别代码 第5关&#xff1a;基尼系数 基尼系数 在ID3算法中我们使用了信息增益来选择特征&#xff0c;信息增益大的优先选择。在C4.5算法中&#xff0c;采用了信息增益率…...

一七一、React性能优化方式

在 React 中进行性能优化可以通过多种手段来减少渲染次数、优化渲染效率并减少内存消耗。以下是常见的性能优化方法及示例&#xff1a; 1. shouldComponentUpdate shouldComponentUpdate 是类组件中的生命周期方法&#xff0c;它可以让组件在判断是否需要重新渲染时&#xff…...

编写dockerfile生成镜像,并且构建容器运行

编写dockerfile生成镜像&#xff0c;并且构建容器运行 目录 编写dockerfile生成镜像&#xff0c;并且构建容器运行 概述 一、dockerfile文件详解 Dockerfile的基本结构 Dockerfile的常用指令 二、构建过程 概述 随着微服务应用越来越多&#xff0c;大家需要尽快掌握dock…...

Java项目练习——学生管理系统

1. 整体结构 代码实现了基本的学生管理系统功能&#xff0c;包括登录、注册、忘记密码、添加、删除、修改和查询学生信息。 使用了ArrayList来存储用户和学生信息。 使用了Scanner类来处理用户输入。 2. 主要功能模块 登录 (logIn)&#xff1a;验证用户名和密码&#xff0c;…...

sqlserver、达梦、mysql的差异

差异项sqlserver达梦mysql单行注释---- 1、-- &#xff0c;--后面带个空格 2、# 包裹对象名称&#xff0c;如表、表字段等 [tableName] "tableName"tableName表字段自增IDENTITY(1, 1)IDENTITY(1, 1)AUTO_INCREMENT二进制数据类型IMAGEIMAGE、BLOBBLOB 存储一个汉字需…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...

LangFlow技术架构分析

&#x1f527; LangFlow 的可视化技术栈 前端节点编辑器 底层框架&#xff1a;基于 &#xff08;一个现代化的 React 节点绘图库&#xff09; 功能&#xff1a; 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...

认识CMake并使用CMake构建自己的第一个项目

1.CMake的作用和优势 跨平台支持&#xff1a;CMake支持多种操作系统和编译器&#xff0c;使用同一份构建配置可以在不同的环境中使用 简化配置&#xff1a;通过CMakeLists.txt文件&#xff0c;用户可以定义项目结构、依赖项、编译选项等&#xff0c;无需手动编写复杂的构建脚本…...