Ehcache 笔记

前言

说道缓存,大家想到的是一定是Redis,确实在国内Redis被大量应用,推上了新的高度!但是不一定所有的场合都要使用Redis,例如服务器资源紧缺,集成不方便的时候就可以考虑使用本地缓存

简介

缓存应该是每个系统都要考虑的架构,缓存不仅可以加速系统的访问速度还可以提升系统的性能。如我们需要经常访问的高频热点数据,如果把它缓存起来就能有效减少数据库服务器的压力。手机验证码等有一定的失效时间,我们就可以考虑使用缓存,等失效时间过了,就删掉验证码。因此市面上缓存组件也层出不进,常见的有

  • JCache:Java缓存API。由JSR107定义,定义了5个核心接口,分别是CachingProvider,CacheManager,Cache,Entry和Expriy
  • EhCache:纯Java的进程内缓存框架,jvm虚拟机中缓存、速度快,效率高,是Hibernate中默认的CacheProvider,但是共享缓存与集群分布式应用整合不方便
  • Redis:生态完善,通过socket访问缓存服务,效率上是比EhCache低的,但是在集群模式、分布式应用上就比较成熟,是大型应用首先中间件
  • Caffeine:Caffeine是使用Java8对Guava缓存的重写版本,有人称它为缓存之王

优点

  1. 快速
  2. 简单
  3. 多种缓存策略(设置有效期等)
  4. 缓存数据有两级:内存和磁盘,因此无需担心容量问题
  5. 缓存数据会在虚拟机重启的过程中写入磁盘
  6. 可以通过RMI、可插入API等方式进行分布式缓存
  7. 具有缓存和缓存管理器的侦听接口
  8. 支持多缓存管理器实例,以及一个实例的多个缓存区域
  9. 提供Hibernate的缓存实现

jar

<!-- https://mvnrepository.com/artifact/net.sf.ehcache/ehcache -->
<dependency><groupId>net.sf.ehcache</groupId><artifactId>ehcache</artifactId><version>2.10.6</version>
</dependency>

本质

就是简单看下SpringBoot关于缓存处理源码是怎么写的。说到底就是上面所说AOP思想,通过动态代理实现,目标方法让代理对象去调用,调用之前先看下缓存有没有,如果有,则从缓存上获取结果并直接返回。如果缓存中没有则执行目标方法,并把方法执行结果缓存。
CacheManager->Cache->Element

Ehcache.xml

默认会加载calsspath下的ehcache.xml,加载失败会加载Ehcache.jar下的ehcache-failsafe.xml

<cache name="account"eternal="false"diskPersistent="false"maxElementsInMemory="10000"timeToIdleSeconds="120"timeToLiveSeconds="120"memoryStoreEvictionPolicy="LRU"></cache><cache name="smsCache"eternal="false"diskPersistent="false"maxElementsInMemory="1000"timeToIdleSeconds="60"timeToLiveSeconds="600"memoryStoreEvictionPolicy="LRU"></cache><!--
name                            缓存名称
eternal                         true表示对象永不过期,此时会忽略timeToIdleSeconds和timeToLiveSeconds属性,默认为false
timeToIdleSeconds               设定允许对象处于空闲状态的最长时间,以秒为单位。当对象自从最近一次被访问后,如果处于空闲状态的时间超过了timeToIdleSeconds属性值,这个对象就会过期,EHCache将把它从缓存中清空。只有当eternal属性为false,该属性才有效。如果该属性值为0,则表示对象可以无限期地处于空闲状态
timeToLiveSeconds               设定对象允许存在于缓存中的最长时间,以秒为单位。当对象自从被存放到缓存中后,如果处于缓存中的时间超过了 timeToLiveSeconds属性值,这个对象就会过期,EHCache将把它从缓存中清除。只有当eternal属性为false,该属性才有效。如果该属性值为0,则表示对象可以无限期地存在于缓存中。timeToLiveSeconds必须大于timeToIdleSeconds属性,才有意义
maxElementsInMemory             内存中最大缓存对象数;maxElementsInMemory界限后,会把溢出的对象写到硬盘缓存中。注意:如果缓存的对象要写入到硬盘中的话,则该对象必须实现了Serializable接口才行
memoryStoreEvictionPolicy       当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。可选策略有:LRU(最近最少使用,默认策略)、FIFO(先进先出)、LFU(最少访问次数)
maxElementsOnDisk               硬盘中最大缓存对象数,若是0表示无穷大
overflowToDisk                  是否保存到磁盘,当系统宕机时
diskPersistent                  是否缓存虚拟机重启期数据,是否持久化磁盘缓存,当这个属性的值为true时,系统在初始化时会在磁盘中查找文件名为cache名称,后缀名为index的文件,这个文件中存放了已经持久化在磁盘中的cache的index,找到后会把cache加载到内存,要想把cache真正持久化到磁盘,写程序时注意执行net.sf.ehcache.Cache.put(Element element)后要调用flush()方法
diskSpoolBufferSizeMB           这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区
diskExpiryThreadIntervalSeconds 磁盘失效线程运行时间间隔,默认为120秒
clearOnFlush                    内存数量最大时是否清除
-->

策略

Ehcache 提供了多种缓存策略,可以根据实际需求选择合适的策略。其中,最常用的包括:

  • LRU(Least Recently Used):移除最近最少使用的缓存项。(时间)
  • LFU(Least Frequently Used):移除最不经常使用的缓存项。(次数)
  • FIFO(First In, First Out):先进先出,即移除最早加入的缓存项。
  • TTL(Time To Live):根据缓存项的过期时间来判断是否要移除该项。
    随机替换:随机选择一项进行移除。

缓存注解-自动

JCache(JSR-107)的注解去大大简化我们的开发。

相关注解和概念说明
Cache缓存接口,定义缓存操作。实现有:RedistCache、EhCacheCache、ConcurrentMapCache等
CacheManager缓存管理器,管理各种缓存(Cache)组件
@Cacheable主要针对方法配置,能够根据方法的请求参数对其结果进行缓存
@CacheEvict清空缓存
@CachePut保证方法被调用,又希望结果被缓存
@EnableCaching开启基于注解的缓存
keyGenerator缓存数据时key生成策略
serialize缓存数据时value序列化策略

JSR-107缓存注解使用

光知道SpringBoot集成Ehcache还不够,我们还要知道怎么使用。然而ehcache在实际应用中可以抽离出来单独使用,但是需要自己手动实例化与put数据,一般不推荐。推荐配合JSR-107缓存注解去使用(因为Spring都给我们封装好了),Spring的缓存功能丰富,它还提供了很多注解,去完成不同的场景~其中使用最多的是@Cacheable注解。

@Cacheable (使用最多)
/* 
@Cacheable几个属性:1.cacheNames/value:缓存组件的名字 2.key:指定缓存数据使用的key,默认使用方法参数的值,可以编写SpEL进行指定,如#id就是参数的值3.keyGenerator:key的生成器,可以自己指定key的生成器的组件id,使用时key/keyGenerator只能二选一4.cacheManager:指定缓存管理器,或者cacheResolver指定获取解析器5.condition:指定复合条件的情况下才缓存,如condition = "#id > 0"6.unless:否定缓存,当unless指定的条件为true,方法的返回值就不会被缓存,如 unless = "#result == null"7.sync:是否启用异步模式,如果启用unless就不支持了。默认为false8.缓存的值就是方法返回的结果
*/
// 使用示例@Override@Cacheable(value = "account",key = "#id")public Account getAccountById(int id) {final Account account = accountDao.selectById(id);return Objects.requireNonNull(account);}
@CachePut

即调用方法,又更新缓存数据。如修改了某个数据库的某个数据,同时更新缓存
执行过程:

  1. 先调用目标方法
  2. 将目标方法的结果缓存起来
    value:命名空间
    key: 主键
    @CachePut(value = "account",key = "#id")public Account getAccountById(int id) {final Account account = accountDao.selectById(id);return Objects.requireNonNull(account);}
@CacheEvict

缓存清除,一般在删除数据方法中使用

    @CacheEvict(value = "account",key = "#id")public boolean deleteAccountById(int id) {return accountDao.deleteById(id) > 0;}

CacheManager-手动

getCache
put
get
remove

 @Autowiredprivate CacheManager cacheManager;@Overridepublic String sendSms(String phoneNumber) {final String uuid = UUID.randomUUID().toString().substring(0, 4);cacheManager.getCache("smsCache").put(new Element(phoneNumber, uuid));return uuid;}@Overridepublic boolean checkSms(String phoneNumber, String code) {final Cache smsCache = cacheManager.getCache("smsCache");smsCache.final Element element = smsCache.get(phoneNumber);final String smscode = (String) element.getObjectValue();return code.equals(smscode);}

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

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

相关文章

禅道的原理及应用详解(三)

本系列文章简介&#xff1a; 在快速发展的软件开发和项目管理领域中&#xff0c;寻找一款高效、实用且易于上手的项目管理工具是每个团队都面临的挑战。禅道&#xff0c;作为一款国产开源的项目管理软件&#xff0c;凭借其独特的管理理念、丰富的功能和友好的用户体验&#xff…

翻译《The Old New Thing》- What a drag: Dragging a virtual file (HGLOBAL edition)

What a drag: Dragging a virtual file (HGLOBAL edition) - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20080318-00/?p23083 Raymond Chen 2008年03月18日 拖拽虚拟文件&#xff08;HGLOBAL 版本&#xff09; 现在我们已经对简单的数据…

数据库(13)——DQL分组查询

语法 SELECT 字段列表 FROM 表名 [WHERE 条件] GROUP BY 分组字段名 [HAVING 分组后过滤条件] 示例 原始表&#xff1a; 根据性别分组并统计人数 select sex,count(*) from information group by sex; 根据性别分组&#xff0c;并求年龄的平均值&#xff1a;

vue iframe src规则

iframe 元素的 src 属性规则与常规的网页链接规则相似&#xff0c;可以是以下几种形式&#xff1a; 1、相对路径&#xff1a;相对于当前页面的路径。例如&#xff0c;如果你想加载当前域名下的一个页面&#xff0c;可以简单地指定其相对路径&#xff1a; <iframe src"…

工厂数字化!数据治理是基础

数据治理是基础 在当今的工业生产中&#xff0c;数字化转型已成为企业提升竞争力的必由之路。然而&#xff0c;数字化转型并非一蹴而就&#xff0c;它需要战略驱动、数据治理和数据智能的协同发展。本文将围绕如何进行数字化、数据治理的内涵以及数据治理作为数字化转型基础的原…

QT系列教程(7) QLineEdit介绍

简介 QLineEdit属于输入插件&#xff0c;用来实现单行录入。支持几种录入模式。 Normal表示正常录入,录入的信息会显示在QLineEdit上。 Password表示密码录入的方式&#xff0c;录入的信息不显示QLineEdit&#xff0c;只是通过黑色圆点显示。 NoEcho 表示不显示录入信息&am…

通过SpringCloudGateway中的GlobalFilter实现鉴权过滤

1.pom.xml中加入gateway jar包 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency> 2.创建权限过滤器 SecurityFilter /*** 鉴权过滤***/ Slf4j Component …

第 11 章 排序

第 11 章 排序 Abstract 排序犹如一把将混乱变为秩序的魔法钥匙&#xff0c;使我们能以更高效的方式理解与处理数据。 无论是简单的升序&#xff0c;还是复杂的分类排列&#xff0c;排序都向我们展示了数据的和谐美感。 本章内容 11.1 排序算法11.2 选择排序11.3 冒…

Ps:调整画笔工具

调整画笔工具 Adjustment Brush Tool可以将选区、创建蒙版和应用调整的传统工作流程合并为一个步骤&#xff0c;简化了对图像进行非破坏性局部调整的操作。 快捷键&#xff1a;B 调整画笔工具是 Photoshop 2024 年 5 月版&#xff08;25.9 版&#xff09;新增的工具。 ◆ ◆ …

【STM32】定时器与PWM的LED控制

目录 一、定时器控制LED周期性亮灭&#xff08;一&#xff09;定时器1.STM32F103定时器分类及区别2.通用定时器主要功能3.通用定时器工作过程 &#xff08;二&#xff09;STM32CubeMX创建工程&#xff08;三&#xff09;代码实现&#xff08;四&#xff09;实验结果 二、PWM模式…

gin接收图片文件,websocet持续返回响应,解决多任务排队问题

背景 有一个需求是这样的&#xff0c;前端需要通过http请求的form-data上传图片文件&#xff0c;后端接收图片后调用AI接口执行命令&#xff0c;由于命令执行时间较长&#xff0c;需要持续返回当前任务在全局任务列表中的位置&#xff0c;以便前端即时更新排队信息。 思考 如…

【源码】Spring Data JPA原理解析之Repository自定义方法命名规则执行原理(二)

Spring Data JPA系列 1、SpringBoot集成JPA及基本使用 2、Spring Data JPA Criteria查询、部分字段查询 3、Spring Data JPA数据批量插入、批量更新真的用对了吗 4、Spring Data JPA的一对一、LazyInitializationException异常、一对多、多对多操作 5、Spring Data JPA自定…

Oracle中TAF与SCANIP全面解析

TAF (Transparent Application Failover) 概念&#xff1a; TAF是Oracle数据库提供的一个高级特性&#xff0c;旨在实现应用程序在数据库连接中断时的透明重连。它允许应用程序在数据库故障发生时&#xff0c;无需修改代码或手动干预&#xff0c;就能自动连接到新的数据库实例…

Java垃圾回收_1

一、垃圾回收 1.如何判断对象可以回收 &#xff08;1&#xff09;引用计数法 存在循环引用问题&#xff0c; Java未使用这种算法 在引用计数法中&#xff0c;每个对象都有一个引用计数器&#xff0c;记录着指向该对象的引用数量。当引用计数器为零时&#xff0c;表示没有任…

JavaSE:SE知识整体总结

1、引言 历时一个多月的学习&#xff0c;已经掌握了JavaSE的知识&#xff0c;这篇博客就来做一下SE知识的总结~ 2、数据类型和变量 Java中的数据类型分为基本数据类型和引用数据类型。 2.1 基本数据类型 基本数据类型共有四类八种&#xff1a; 四类&#xff1a;整形、浮点…

在phpstorm2024版里如何使用Jetbrains ai assistant 插件 ?

ai assistant激活成功后&#xff0c;如图 ai assistant渠道&#xff1a;https://web.52shizhan.cn/activity/ai-assistant 在去年五月份的 Google I/O 2023 上&#xff0c;Google 为 Android Studio 推出了 Studio Bot 功能&#xff0c;使用了谷歌编码基础模型 Codey,Codey 是…

SpringBoot HelloWorld 之 实现注册功能

SpringBoot HelloWorld 之 实现注册功能 一.配置 创建数据库big_event CREATE TABLE user (id int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT ID,username varchar(20) COLLATE utf8_unicode_ci NOT NULL COMMENT 用户名,password varchar(32) COLLATE utf8_unicode_ci …

Vue3项目练习详细步骤(第五部分:用户模块的功能)

顶部导航栏个人信息显示 接口文档 接口请求与绑定 导航栏下拉菜单功能 路由实现 退出登录和路由跳转实现 基本资料修改 页面结构 接口文档 接口请求与绑定 修改头像 页面结构 头像回显 头像上传 接口文档 重置密码 页面结构 接口文档 接口请求与绑定 顶部导航…

自然语言处理学习路线

学习目标 NLP 系统知识&#xff08;从入门到入土&#xff09; 学习内容 NLP的基本流程&#xff1a;&#xff08;待更&#xff09;文本预处理&#xff08;标点符号处理、繁体转简体、分词Tokenizer&#xff09;&#xff1a;&#xff08;待更&#xff09;词袋模型&#xff08;TF…

【T+】畅捷通T+软件固定资产模块反启用

【问题描述】 畅捷通T软件&#xff0c;固定资产模块反启用。 【解决方法】 针对账套库执行如下脚本清除资产的所有数据&#xff0c; 执行前请与客户确认资产的所有数据都不要了&#xff0c;确认后备份账套再执行脚本&#xff0c;切记&#xff01;&#xff01;&#xff01; 然后…