Spring Boot2 整合 Ehcache

用惯了 Redis ,很多人已经忘记了还有另一个缓存方案 Ehcache ,是的,在 Redis 一统江湖的时代,Ehcache 渐渐有点没落了,不过,我们还是有必要了解下 Ehcache ,在有的场景下,我们还是会用到 Ehcache。

今天gblfy就来和大家聊聊 Spring Boot 中使用 Ehcache 的情况。相信看完本文,大家对于[Spring Boot 操作 Redis,三种方案全解析!]一文中的第二种方案会有更加深刻的理解。

Ehcache 也是 Java 领域比较优秀的缓存方案之一,Ehcache 这个缓存的名字很有意思,正着念反着念,都是 Ehcache,Spring Boot 中对此也提供了很好的支持,这个支持主要是通过 Spring Cache 来实现的。

Spring Cache 可以整合 Redis,当然也可以整合 Ehcache,两种缓存方案的整合还是比较相似,主要是配置的差异,具体的用法是一模一样的,就类似于 JDBC 和 数据库驱动的关系一样。前面配置完成后,后面具体使用的 API 都是一样的。

和 Spring Cache + Redis 相比,Spring Cache + Ehcache 主要是配置有所差异,具体的用法是一模一样的。我们来看下使用步骤。

项目创建
首先,来创建一个 Spring Boot 项目,引入 Cache 和web依赖:

在这里插入图片描述
工程创建完成后,引入 Ehcache 的依赖,Ehcache 目前有两个版本:
在这里插入图片描述
这里采用第二个,在 pom.xml 文件中,引入 Ehcache 依赖:

    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId></dependency><dependency><groupId>net.sf.ehcache</groupId><artifactId>ehcache</artifactId><version>2.10.6</version></dependency>

添加 Ehcache 配置
在 resources 目录下,添加 ehcache 的配置文件 ehcache.xml ,文件内容如下:

<ehcache><diskStore path="java.io.tmpdir/springboot-sample"/><!--diskStore:表示缓存持久化的文件夹下面定义的不同cache 节点属于不同的缓存策略name:缓存名称。maxElementsInMemory:缓存最大个数。eternal:对象是否永久有效,一但设置了,timeout将不起作用。timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。timeToLiveSeconds:设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大。overflowToDisk:当内存中对象数量达到maxElementsInMemory时,Ehcache将会对象写到磁盘中。diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。maxElementsOnDisk:硬盘最大缓存个数。diskPersistent:是否缓存虚拟机重启期数据 Whether the disk store persists between restarts of the Virtual Machine. The default value is false.diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。clearOnFlush:内存数量最大时是否清除。--><defaultCachemaxElementsInMemory="10000"eternal="false"timeToIdleSeconds="120"timeToLiveSeconds="120"overflowToDisk="false"diskPersistent="false"diskExpiryThreadIntervalSeconds="120"/><cache name="user"maxElementsInMemory="10000"eternal="true"overflowToDisk="true"diskPersistent="true"diskExpiryThreadIntervalSeconds="600"/>
</ehcache>

注意

默认情况下,这个文件名是固定的,必须叫 ehcache.xml ,如果一定要换一个名字,那么需要在 application.properties 中明确指定配置文件名,配置方式如下:

#spring.cache.ehcache.config=classpath:aaa.xml

开启缓存
开启缓存的方式,也和 Redis 中一样,如下添加 @EnableCaching 依赖即可:

@SpringBootApplication
@EnableCaching
public class Springboot2EhcacheApplication {public static void main(String[] args) {SpringApplication.run(Springboot2EhcacheApplication.class, args);}}

其实到这一步,Ehcache 就算配置完成了,接下来的用法,和松哥之前讲 Redis 的文章一模一样。不过这里gblfy还是带大家使用下。
这里主要向小伙伴们介绍缓存中几个核心的注解使用。

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

@Service
@CacheConfig(cacheNames = "user")
public class HelloService {}

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

@Cacheable(key = "#id")public User getUserById(long id, String name) {System.out.println("getUserById");return getUserFromDBById(id);}

当有多个参数时,默认就使用多个参数来做 key ,如果只需要其中某一个参数做 key ,则可以在 @Cacheable 注解中,通过 key 属性来指定 key ,如上代码就表示只使用 id 作为缓存的 key ,如果对 key 有复杂的要求,可以自定义 keyGenerator 。当然,Spring Cache 中提供了root对象,可以在不定义 keyGenerator 的情况下实现一些复杂的效果,root 对象有如下属性:
在这里插入图片描述
也可以通过 keyGenerator 自定义 key ,方式如下:

@Component
public class MyKeyGenerator implements KeyGenerator {@Overridepublic Object generate(Object target, Method method, Object... params) {return method.getName() + Arrays.toString(params);}
}

然后在方法上使用该 keyGenerator

  @Cacheable(keyGenerator = "myKeyGenerator")public User getUserById(Long id) {User user = new User().builder().id(id).name("gblfy").build();System.out.println(user);return user;}

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

  @CachePut(key = "user.id")public User updateUserById(User user){//这里写更新操作return user;}

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

 @CacheEvict()public void deleteUserById(long id){//    在这里执行删除操作,删除就是去数据库中删除}

本文主要向大家了 Spring Boot 整合 Ehcache 的用法,其实说白了还是 Spring Cache 的用法。相信读完本文,大家对于 Redis + Spring Cache 的用法会有更深的认识。

本文案例我已上传到 码云,欢迎大家 star:
https://gitee.com/gb_90/SpringBoot2_Practical_Column

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

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

相关文章

传奇谢幕,回顾霍金76载传奇人生

摘要&#xff1a; 根据外媒报道&#xff0c;著名物理学家斯蒂芬威廉霍金&#xff08;Stephen William Hawking&#xff09;去世&#xff0c;享年76岁&#xff0c;霍金的家人已经确认了这一消息。 原文地址&#xff1a;http://click.aliyun.com/m/43771/ “在爱因斯坦生日这天&a…

数据中台与苏秦挂六国相印

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 一一来源 | 边缘计算社区阅读本文前先思考一个问题&#xff1a;数据中台如何创造更多价值&#xff1f;1梁宁看中台——什么是数据中台梁宁老师是阿里巴巴的湖畔大学产品模块学术主任、百度集团顾问。有人问梁宁&#xff0c;中…

python中函数定义_Python中函数的定义与使用

原博文 2020-02-27 16:46 − 一、函数基本定义 定义函数的目的是为了让一段代码可以被重复使用 函数定义的语法&#xff1a; def 函数名([参数&#xff0c;参数.....]): 函数主体代码(多行代码) [return [返回值]]注&#xff1a;函数中的函数体都通过缩进来定义 实例一&#xf…

非计算机专业教学改革,非计算机专业算法分析与设计教学改革论文

非计算机专业算法分析与设计教学改革论文【摘要】算法分析与设计不仅是计算机专业的核心课程&#xff0c;同时也是与计算机有关的非计算机专业的专业课。本人针对非计算机专业学生在学习过程中存在的若干问题&#xff0c;就教学内容、教学手段和考核方式等方面提出了改革措施。…

阿里SaaS性能测试平台PTS最佳实践

摘要&#xff1a; PTS&#xff08;Performance Testing Service&#xff09;是web化的卓越的SaaS性能测试平台&#xff0c;具备强大的分布式压测能力&#xff0c;可方便的模拟海量用户的真实业务场景。PTS铂金版在功能上强调页面可视化编排&#xff0c;目前也在快速迭代中&…

go 根据输入类型执行对应的方法_安全很重要:Go项目的安全评估技术

在今年夏天我们对Kubernetes的评估成功之后&#xff0c;我们收到了大量Go项目的安全评估需求。为此&#xff0c;我们将在其他编译语言中使用过的安全评估技术和策略调整适配到多个Go项目中。我们从了解语言的设计开始&#xff0c;识别出开发人员可能无法完全理解语言语义特性的…

云化要求下,数据库架构如何演进?

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者简介&#xff1a;王涛SequoiaDB联合创始人&CTO如今&#xff0c;大型企业如金融企业和银行等&#xff0c;在下一代的微服务架构转型要求下&#xff0c;需要基础软件和数据平台能够实现原生的云化&#xff0c;以满足微服务架构…

看阿里云如何为直播用户营造临场沉浸感?

摘要&#xff1a; 2016年可以说是VR元年&#xff0c;从Facebook的Oculus&#xff0c;HTC的Vive到Sony的PS VR&#xff0c;层出不穷的VR设备和VR内容让用户逐步开始体验到了虚拟现实的魅力。VR视频和VR直播俨然已经成为了展览会议、活动赛事的标配&#xff0c;甚至向婚庆、新闻、…

html计时器组件,vue 计时器组件的实现代码

整理文档&#xff0c;搜刮出一个vue 计时器组件的代码&#xff0c;稍微整理精简一下做下分享。:sendSync"sendSync":autoStart"autoStart":defaultVal"defaultVal">{{countString}}export default {data() {return {isStart: false,globalTim…

苹果遭集体诉讼;华为或年底推出鸿蒙系统中低端智能手机;Facebook雇人记录用户语音通话以改善AI技术……...

戳蓝字“CSDN云计算”关注我们哦&#xff01;嗨&#xff0c;大家好&#xff0c;重磅君带来的【云重磅】特别栏目&#xff0c;如期而至&#xff0c;每周五第一时间为大家带来重磅新闻。把握技术风向标&#xff0c;了解行业应用与实践&#xff0c;就交给我重磅君吧&#xff01;重…

map语法获取index_复习Elasticsearch的基础语法(一)

之前实践过的Elasticsearch到现在基本上的语法我都回忆不起来了&#xff0c;所以准备写篇文章帮助自己复习一下&#xff0c;没有什么技术含量的分享&#xff0c;但是也分享给想初步了解的朋友们。就不介绍Elasticsearch了&#xff0c;直接进入正文(手动分割线0.0)-------------…

知识图谱数据构建的“硬骨头”,阿里工程师如何拿下?

摘要&#xff1a; 背景简介 为了不断提升搜索体验&#xff0c;神马搜索的知识图谱与应用团队&#xff0c;一直在不断探索和完善图谱的构建技术。其中&#xff0c;开放信息抽取&#xff08;Open Information Extraction&#xff09;&#xff0c;或称通用信息抽取&#xff0c;旨在…

如何通过Dataworks禁止MaxCompute 子账号跨Project访问

摘要&#xff1a; 之前有很多DataWorks用户问MaxCompute访问权限问题&#xff0c;比如子账号为什么可以增删查别人在别的项目创建的表&#xff0c;即使这个子账号并没有加入那个项目 。 今天手把手教大家实现子账号授权并关闭跨Project的数据访问权限。 原文链接&#xff1a;ht…

填补服务机器人市场空白,九号机器人提供智能服务场景解决方案!

现如今&#xff0c;随着社会化和城市化进程的不断加快&#xff0c;快递、外卖等行业日益成熟&#xff0c;然而人工成本高、管理难度大等一系列问题成为该领域不得不思考的问题。那么&#xff0c;如何释放出更强大的服务信号&#xff0c;让“最后一公里”的窘境有一个全新的转变…

武汉大学计算机学院的李明,李明副研究员

个人简介&#xff1a;李明&#xff0c;武汉大学&#xff0c;计算机学院&#xff0c;副研究员&#xff0c;德国KIT的MRT实验室访问学者&#xff0c;在Audi无人驾驶项目中负责定位和地图部分&#xff0c;主要研究方向是多传感器集成、激光雷达数据处理、行驶环境感知方向的工作&a…

eureka集群只注册一个_一、Spring Cloud Eureka服务注册中心

Sping bootEureka是服务中心&#xff0c;管理各种服务功能包括服务的注册、发现、熔断、负载、降级等。Spring Cloud Eureka 是对Netflix公司的Eureka的二次封装。在dubbo的使用中我们通常使用zookeeper作为注册中心。在这里spring cloud使用Eureka&#xff0c; 用一个标准的sp…

基于阿里云数加MaxCompute的企业大数据仓库架构建设思路

摘要&#xff1a; 数加大数据直播系列课程主要以基于阿里云数加MaxCompute的企业大数据仓库架构建设思路为主题分享阿里巴巴的大数据是怎么演变以及怎样利用大数据技术构建企业级大数据平台。 本次分享嘉宾是来自阿里云大数据的技术专家祎休 背景与总体思路 数据仓库是一个面向…

拿来就能用!行,这本 Python 书彻底火了!

戳蓝字“CSDN云计算”关注我们哦&#xff01;Python越来越牛了&#xff1f;自从连续半年拿下TOP1编程语言后&#xff0c;无论是薪资还是招聘需求&#xff0c;都越来越多了&#xff01;同时&#xff0c;作为CSDN的编程小姐姐&#xff0c;我发现只要我推送Python相关的文章&#…

easyui datagrid url不请求请求_Go Web编程--深入学习解析HTTP请求

之前这个系列的文章一直在讲用Go语言怎么编写HTTP服务器来提供服务&#xff0c;如何给服务器配置路由来匹配请求到对应的处理程序&#xff0c;如何添加中间件把一些通用的处理任务从具体的Handler中解耦出来&#xff0c;以及如何更规范地在项目中应用数据库。不过一直漏掉了一个…

MaxCompute JOIN优化小结

摘要&#xff1a; Join是MaxCompute中最基本的语法&#xff0c;但由于数据量和倾斜问题&#xff0c;非常容易出现性能问题。一般情况下&#xff0c;join产生的问题有两大类&#xff1a; 数据倾斜问题&#xff1a;join会将key相同的数据分发到同一个instance上处理&#xff0c;如…