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-挖掘数据的无限可能》(数据爬虫采集工具)
豆包,攻克数字是个什么工具? “攻克数字” 指的是 “攻克数字(GKData)” 这样一款工具。是一款针对网页、APP中数据自动解析转表存入数据库的软件,为数据工作者而生。它是一个不会编程也能用的可视化数据解析为标准二…...
说一说QWidget
目录 关于QWidget 作为界面组件时,你需要有印象的 1. 控制属性 2. 组件状态与交互属性 3. 外观和样式属性 4. 布局与子组件管理属性 5. 图标和光标属性 6. 大小策略属性 作为单独的窗体的属性 写Qt快两年了,也写过一些规模偏大的软件,…...
Web3.0技术入门
Web3.0技术入门是一个涉及多个方面和领域的复杂过程,以下是一些关键的步骤和要点,帮助您初步了解并掌握Web3.0技术。 一、了解Web3.0的基本概念 Web3.0也被称为下一代互联网,它是对当前互联网(Web2.0)的演进和升级。…...
spygalss cdc 检测的bug(二)
当allow_qualifier_merge设置为strict的时候,sg是要检查门的极性的。 如果qualifier和src经过与门汇聚,在同另一个src1信号或门汇聚,sg是报unsync的。 假设当qualifier为0时,0&&src||src1src1,src1无法被gat…...
集合论(ZFC)之 选择公理(Axiom of Choice)注解
直观感受(Intuition) 集合论(ZFC)中的 "C" 指的是选择公理(Axiom of Choice)中的"choice"。简单来说,对于任一非空集合 S,那么存在一个函数 f,选择出…...
JS:字符串操作
目录 1、 字符串分割 1、 字符串分割 var str "123,456,789"; console.log(str.split(,)); // ["123", "456", "789"]...
.NET 一款二进制文件转换Shellcode的工具
01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失…...
【CSS】——基础入门常见操作
阿华代码,不是逆风,就是我疯 你们的点赞收藏是我前进最大的动力!! 希望本文内容能够帮助到你!! 目录 一:CSS引入 二:CSS对元素进行美化 1:style修饰 2:选…...
LuaJIT源码分析(五)词法分析
LuaJIT源码分析(五)词法分析 lua虽然是脚本语言,但在执行时,还是先将脚本编译成字节码,然后再由虚拟机解释执行。在编译脚本时,首先需要对源代码进行词法分析,把源代码分解为token流。lua的toke…...
005 匿名信
005 匿名信 题目描述 电视剧《分界线》里面有一个片段,男主为了向警察透露案件细节,且不暴露自己,于是将报刊上的字剪下来,剪拼成一封匿名信。现在有一名举报人,希望借鉴这种方式,使用英文报刊完成举报操…...
聊聊Web3D 发展趋势
随着 Web 技术的不断演进,Web3D 正逐渐成为各行业数字化的重要方向。Web3D 是指在网页中展示 3D 内容的技术集合。近年来,由于 WebGL、WebGPU 等技术的发展,3D 内容已经能够直接在浏览器中渲染,为用户提供更加沉浸、互动的体验。以…...
【数据结构与算法】LeetCode: 贪心算法
文章目录 LeetCode: 贪心算法买卖股票的最佳时机 (Hot100)买卖股票的最佳时机 II跳跃游戏 (Hot100)跳跃游戏 II(Hot100)划分字母区间 (Hot100)分发饼干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级别低功耗、超高灵敏度,瞬间响应快
在当今科技飞速发展的时代,智能家居已经逐渐成为人们生活中不可或缺的一部分。从智能灯光控制到智能家电的联动,每一个细节都在为我们的生活带来便利和舒适。而在众多智能家居产品中,10G 雷达感应开关模块以其独特的优势,正逐渐成…...
头歌——人工智能(机器学习 --- 决策树2)
文章目录 第5关:基尼系数代码 第6关:预剪枝与后剪枝代码 第7关:鸢尾花识别代码 第5关:基尼系数 基尼系数 在ID3算法中我们使用了信息增益来选择特征,信息增益大的优先选择。在C4.5算法中,采用了信息增益率…...
一七一、React性能优化方式
在 React 中进行性能优化可以通过多种手段来减少渲染次数、优化渲染效率并减少内存消耗。以下是常见的性能优化方法及示例: 1. shouldComponentUpdate shouldComponentUpdate 是类组件中的生命周期方法,它可以让组件在判断是否需要重新渲染时ÿ…...
编写dockerfile生成镜像,并且构建容器运行
编写dockerfile生成镜像,并且构建容器运行 目录 编写dockerfile生成镜像,并且构建容器运行 概述 一、dockerfile文件详解 Dockerfile的基本结构 Dockerfile的常用指令 二、构建过程 概述 随着微服务应用越来越多,大家需要尽快掌握dock…...
Java项目练习——学生管理系统
1. 整体结构 代码实现了基本的学生管理系统功能,包括登录、注册、忘记密码、添加、删除、修改和查询学生信息。 使用了ArrayList来存储用户和学生信息。 使用了Scanner类来处理用户输入。 2. 主要功能模块 登录 (logIn):验证用户名和密码,…...
sqlserver、达梦、mysql的差异
差异项sqlserver达梦mysql单行注释---- 1、-- ,--后面带个空格 2、# 包裹对象名称,如表、表字段等 [tableName] "tableName"tableName表字段自增IDENTITY(1, 1)IDENTITY(1, 1)AUTO_INCREMENT二进制数据类型IMAGEIMAGE、BLOBBLOB 存储一个汉字需…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
