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,"⽤户删除失败!");
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/57996.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

技术杂谈与进阶01--------战时操作系统与国产化数据库 |截止到目前修改时间,本文已上全站综合热榜

写文不易 给我点点关注 和点点赞 点点收藏吧 目录 为什么国产化&#xff1f; 操作系统 suse 统信uos 的阉割版 deepin &#xff08;deepin又名深度操作系统&#xff09; 麒麟 的阉割版 -欧拉 debian 的修改残版 ubuntu 国产数据库 开源数据库 部分开源数据库 …

uniapp使用uni-push模拟推送

uniapp使用uni-push模拟推送 第一步先去uniapp开发者中心添加开通uni-push功能 这里的Android 应用签名可以先用测试的官网有,可以先用这个测试 官方测试链接文档地址 在项目中的配置文件勾选 组件中使用 如果要实时可以去做全局ws //消息推送模版uni.createPushMessage(…

人工智能进程;算子加速的具体计算部分;大模型GPT5:参数18万亿;大模型面临问题

目录 人工智能进程 算子加速的简单理解,举例说明 一、简单理解 二、举例说明 一、算子加速的具体计算部分 二、举例说明 三、算子加速是否仅针对GPU 大模型GPT5:参数18万亿 大模型面临问题 算力集群设计框架 人工智能进程

算法-二叉树的最大路径和

为了找到二叉树的最大路径和&#xff0c;我们需要考虑所有可能的路径&#xff0c;包括不经过根节点的路径&#xff0c;所以其实如果你从整体上来一条路径一条路径的遍历&#xff0c;太复杂&#xff0c;我们可以换个思路&#xff0c;从每个节点出发&#xff0c;就把那个节点当成…

C++ | Leetcode C++题解之第504题七进制数

题目&#xff1a; 题解&#xff1a; class Solution { public:string convertToBase7(int num) {if (num 0) {return "0";}bool negative num < 0;num abs(num);string digits;while (num > 0) {digits.push_back(num % 7 0);num / 7;}if (negative) {dig…

Github优质项目推荐(第八期)

文章目录 Github优质项目推荐 - 第八期一、【manim】&#xff0c;66.5k stars - 创建数学动画的 Python 框架二、【siyuan】&#xff0c;19.5k stars - 个人知识管理软件三、 【GetQzonehistory】&#xff0c;1.3k stars - 获取QQ空间发布的历史说说四、【SecLists】&#xff0…

Redis 过期策略 总结

前言 相关系列 《Redis & 目录》&#xff08;持续更新&#xff09;《Redis & 过期策略 & 源码》&#xff08;学习过程/多有漏误/仅作参考/不再更新&#xff09;《Redis & 过期策略 & 总结》&#xff08;学习总结/最新最准/持续更新&#xff09;《Redis &a…

python 制作 发货单 (生成 html, pdf)

起因&#xff0c; 目的: 某个小店&#xff0c;想做个发货单。 过程: 先写一个 html 模板。准备数据&#xff0c; 一般是从数据库读取&#xff0c;也可以是 json 格式&#xff0c;或是 python 字典。总之&#xff0c;是数据内容。使用 jinja2 来渲染模板。最终的结果可以是 h…

【Jenkins】解决在Jenkins Agent节点容器内无法访问物理机的docker和docker compose的问题

解决在Jenkins Agent节点容器内无法访问物理机的docker和docker compose的问题 1. 确定物理机docker和docker compose已经安装2. 编写Jenkins Agent结点docker-compose.yaml配置文件3. 修改docker运行时文件权限4. 启动容器并验证 最近接触到一个发布产物是一个 docker镜像的项…

AAPL: Adding Attributes to Prompt Learning for Vision-Language Models

文章汇总 当前的问题 1.元标记未能捕获分类的关键语义特征 如下图(a)所示&#xff0c; π \pi π在类聚类方面没有显示出很大的差异&#xff0c;这表明元标记 π \pi π未能捕获分类的关键语义特征。我们进行简单的数据增强后&#xff0c;如图(b)所示&#xff0c;效果也是如…

Android使用协程实现自定义Toast弹框

Android使用协程实现自定义Toast弹框 ​ 最近有个消息提示需要显示10s,刚开始使用协程写了一个shoowToast方法&#xff0c;传入消息内容、显示时间和toast显示类型即可&#xff0c;以为能满足需求&#xff0c;结果测试说只有5s&#xff0c;查看日志和源码发现Android系统中Toa…

【AI大模型】深入解析 存储和展示地理数据(.kmz)文件格式:结构、应用与项目实战

文章目录 1. 引言2. 什么是 .kmz 文件&#xff1f;2.1 .kmz 文件的定义与用途2.2 .kmz 与 .kml 的关系2.3 常见的 .kmz 文件使用场景 3. .kmz 文件的内部结构3.1 .kmz 文件的压缩格式3.2 解压缩 .kmz 文件的方法3.3 .kmz 文件的典型内容3.4 .kml 文件的结构与主要元素介绍 4. 深…

WPF+Mvvm案例实战(五)- 自定义雷达图实现

文章目录 1、项目准备1、创建文件2、用户控件库 2、功能实现1、用户控件库1、控件样式实现2、数据模型实现 2、应用程序代码实现1.UI层代码实现2、数据后台代码实现3、主界面菜单添加1、后台按钮方法改造&#xff1a;2、按钮添加&#xff1a;3、依赖注入 3、运行效果4、源代码获…

TikTok运营对IP有什么要求?

TikTok在进行直播带货时&#xff0c;网络环境的配置尤为关键&#xff0c;网络质量直接影响到直播效果&#xff0c;因此选择稳定的IP地址很重要。那么&#xff0c;TikTok直播时该选择什么样的IP地址呢&#xff1f;接下来&#xff0c;我们来深入分析一下。 TikTok对IP地址的要求 …

解读数字化转型的敏捷架构:从理论到实践的深度分析

在当今数字经济的推动下&#xff0c;企业要在瞬息万变的市场中保持竞争力&#xff0c;数字化转型已经不再是一种选择&#xff0c;而是不可避免的战略需求。然而&#xff0c;企业如何从理论到实践进行有效的转型&#xff0c;尤其是在复杂的技术环境中&#xff0c;如何通过正确的…

【FISCO BCOS】二十二、使用Key Manager加密区块链节点

#1024程序员节&#xff5c;征文# 落盘加密是对节点存储在硬盘上的内容进行加密&#xff0c;加密的内容包括&#xff1a;合约的数据、节点的私钥。具体的落盘加密介绍&#xff0c;可参考&#xff1a;落盘加密的介绍&#xff0c;今天我们来部署并对节点进行落盘加密。 环境&a…

信息学奥赛后的发展路径:科技创新、竞赛选拔还是学术研究?

参加信息学奥赛&#xff08;OI&#xff09;后&#xff0c;学生往往具备了较强的编程能力、逻辑思维和算法知识&#xff0c;而这些技能在多种发展路径上都有广泛应用。对于有志于深入发展的学生来说&#xff0c;选择合适的发展方向尤为重要。本文将详细讨论信息学奥赛后学生的三…

Linux中DHCP服务器配置和管理

文章目录 一、DHCP服务1.1、DHCP的工作流程1.2、DHCP的工作模式1.3、dhcp的主要配置文件 二、安装DHCP服务2.1、更新yum源2.2、安装DHCP服务软件包2.3、配置DHCP服务2.4、启用DHCP服务&#xff08;解决报错&#xff09;2.4.1、查看dhcpd服务的状态和最近的日志条目2.4.2、查看与…

<网络> 网络套接字编程(二)

文章目录 目录 文章目录 一、简单的TCP网络程序 1. 服务器创建套接字 2. 服务器绑定 3. 服务器监听 listen 4. 服务器获取连接 accept 5. 服务器处理请求 6. 客户端创建套接字 7. 客户端连接服务器 connect 8. 客户端发起请求 9. 服务器测试 10. 单执行流服务器弊端 二、多进程…

技术成神之路:设计模式(二十一)外观模式

相关文章&#xff1a;技术成神之路&#xff1a;二十三种设计模式(导航页) 介绍 外观模式&#xff08;Facade Pattern&#xff09;是一种结构型设计模式&#xff0c;它为子系统中的一组接口提供一个统一的接口。外观模式定义了一个高层接口&#xff0c;使得子系统更容易使用。 …