(一)引入缓存管理的重要性
缓存是分布式系统中的重要组件,主要解决数据库数据的高并发访问。在实际开发中,尤其是用户访问量较大的网站,用户对高频热点数据的访问非常频繁,为了提高服务器访问性能、减少数据库的压力、提高用户体验,使用缓存显得尤为重要,Spring Boot针对这种实际需求,对缓存提供了良好的支持。
(二)Spring Boot的缓存管理
Spring框架支持透明地向应用程序添加缓存对缓存进行管理,其管理缓存的核心是将缓存应用于操作数据的方法,从而减少操作数据的执行次数,同时不会对程序本身造成任何干扰。Spring Boot继承了Spring框架的缓存管理功能,通过使用@EnableCaching注解开启基于注解的缓存支持,Spring Boot可以启动缓存管理的自动化配置。
八、Spring Boot默认缓存
=================
(一)数据准备
(二)创建Spring Boot项目 - DefaultCacheDemo
(三)创建数据库表对应的实体类
1、创建评论实体类 - Comment
2、创建文章实体类 - Article
(四)创建Repository接口
1、创建评论仓库接口 - CommentRepository
2、创建文章仓库接口 - ArticleRepository
(五)编写Service类
1、创建CommentService类
2、创建ArticleService类
(六)编写控制器
1、编写评论控制器 - CommentController
2、编写文章控制器 - ArticleController
(七)配置全局属性文件
(八)启动应用,测试效果
1、测试查询
查询编号为1的评论记录
访问
http://localhost:8080/find/1
2、测试更新
修改编号1的评论记录,内容改为“十分有趣,值得一读”,作者改为“无心剑”
访问
http://localhost:8080/update?id=1&comment=十分有趣,值得一读&author=无心剑&aId=1
再次查询编号为1的评论记录
看,是不是评论的内容和作者都已经修改成功了?
3、测试删除
删除编号为1的评论
访问
http://localhost:8080/delete/1
再次查询编号为1的评论记录
查看评论表 - t_comment
(九)课后拓展练习
完成ArticleService,ArticleController类并进行测试 - 查询、更新、删除
更新时如果给定的参数值中有中文,写入数据库是乱码,查询资料,解决乱码问题
(十)测试未启用缓存的效果
访问
http://localhost:8080/find/2,查看刷新页面效果
说明:页面每刷新一次,控制台会输出一次SQL语句,即每查询一次,就会访问一次数据库,大大增加了数据库的负担。
(十一)开启默认缓存
1、在入口类上加注释@EnableCaching
该注解一般使用在类上,通常使用在入口 类上
2、在服务类需要启用缓存的方法上加注解@Cacheable
@Cacheable注解既可用在方法上,也可用在类上
(十二)测试启用默认缓存后的效果
启动应用,访问
http://localhost:8080/find/2,并刷新页面查看效果
说明:第一次访问页面时控制台会有SQL语句输出,往后刷新时则不会继续输出SQL语句,即不再连接数据库取数据,而是从缓存中取数据。
九、Spring Boot默认缓存小结
===================
(一)使用缓存的作用
缓存一般用在查询方法上,可以减轻数据库服务器的压力。
(二)常用注解
1、@EnableCaching注解
该注解一般使用在Spring Boot项目的入口类上,开启项目的缓存功能
2、@Cachable注解
-
@Cacheable注解也是由Spring框架提供的,可以作用于类或方法(通常用在数据查询方法上),用于对方法结果进行缓存存储。
-
@Cacheable注解的执行顺序是,先进行缓存查询,如果为空则进行方法查询,并将结果进行缓存;如果缓存中有数据,不进行方法查询,而是直接使用缓存数据。
-
@Cacheable可以指定三个属性,value、key和condition。
(1)value属性
value属性是必须指定的,其表示当前方法的返回值是会被缓存在哪个Cache上的,对应Cache的名称。其可以是一个Cache也可以是多个Cache。
(2)key属性
key属性是用来指定Spring缓存方法的返回结果时对应的key的。该属性支持SpringEL表达式。当我们没有指定该属性时,Spring将使用默认策略生成key。
(3)condition属性
-
有的时候我们可能并不希望缓存一个方法所有的返回结果。通过condition属性可以实现这一功能。condition属性默认为空,表示将缓存所有的调用情形。其值是通过SpringEL表达式来指定的,当为true时表示进行缓存处理;当为false时表示不进行缓存处理,即每次调用该方法时该方法都会执行一次。
-
案例演示:只有当comment的id为偶数时才会进行缓存。
3、@CachePut注解
-
在支持Spring Cache的环境下,对于使用@Cacheable标注的方法,Spring在每次执行前都会检查Cache中是否存在相同key的缓存元素,如果存在就不再执行该方法,而是直接从缓存中获取结果进行返回,否则才会执行并将返回结果存入指定的缓存中。
-
@CachePut也可以声明一个方法支持缓存功能。与@Cacheable不同的是使用@CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。
-
@CachePut也可以标注在类上和方法上。使用@CachePut时我们可以指定的属性跟@Cacheable是一样的。
4、@CacheEvict注解
@CacheEvict是用来标注在需要清除缓存元素的方法或类上的。当标记在一个类上时表示其中所有的方法的执行都会触发缓存的清除操作。@CacheEvict可以指定的属性有value、key、condition、allEntries和beforeInvocation。
其中value、key和condition的语义与@Cacheable对应的属性类似。即value表示清除操作是发生在哪些Cache上的(对应Cache的名称);key表示需要清除的是哪个key,如未指定则会使用默认策略生成的key;condition表示清除操作发生的条件。
下面我们来介绍一下新出现的两个属性allEntries和beforeInvocation。
(1)allEntries属性
allEntries是boolean类型,表示是否需要清除缓存中的所有元素。默认为false,表示不需要。当指定了allEntries为true时,Spring Cache将忽略指定的key。有的时候我们需要Cache一下清除所有的元素,这比一个一个清除元素更有效率。
(2)beforeInvocation属性
清除操作默认是在对应方法成功执行之后触发的,即方法如果因为抛出异常而未能成功返回时也不会触发清除操作。使用beforeInvocation可以改变触发清除操作的时间,当我们指定该属性值为true时,Spring会在调用该方法之前清除缓存中的指定元素。
学习目标
-
了解Spring Boot支持的缓存组件
-
掌握基于注解的Redis缓存实现
-
掌握基于API的Redis缓存实现
十、Spring Boot支持的缓存组件
====================
Spring Boot内部嵌入了支持的一系列缓存管理组件,并按照顺序查找加载有效的缓存组件进行缓存管理,如果没有任何缓存组件,会默认使用最后一个Simple默认缓存管理组件进行管理。在实际开发中,通常会使用专业的第三方缓存插件进行缓存管理。
如果开启了缓存,Spring Boot会按照以下顺序去查找缓存组件:
-
Generic
-
JCache (JSR-107) (EhCache 3、Hazelcast、Infinispan等)
-
EhCache 2.x
-
Hazelcast
-
Infinispan
-
Couchbase
-
Redis
-
Caffeine
-
Simple(默认)
十一、基于注解的Redis缓存实现
=================
(一)安装与启动Redis
(二)创建Spring Boot项目 - RedisCacheDemo01
设置组标识、项目标识、包名
添加Spring Web、Spring Data JPA、MySQL Driver、Spring Data Redis依赖
设置项目名及保存位置
查看pom.xml文件
(三)创建评论实体类 - Comment
要实现缓存,实体类必须要实现序列化接口Serializable
(四)创建评论仓库接口 - CommentRepository
自定义方法添加注解@Modifying实现数据更新操作
(五)创建评论服务类 - CommentService
(六)创建评论控制器 - CommentController
(七)配置系统属性文件 - application.properties
(八)在入口类添加注解@EnableCaching开启缓存
(九)Redis可视化工具连接Redis服务
在命令行窗口,启动Redis服务
启动Redis可视化管理工具
(十)启动应用,测试效果
1、测试各个方法的观察点
-
浏览器返回值
-
控制台输出数据
-
Redis数据数据变化
-
MySQL数据库数据变化
2、基于注解的Redis查询缓存测试
MySQL数据库评论表原始数据
Redis数据库原始数据
访问
http://localhost:8080/find/1
查看控制台输出的SQL语句
查看Redis数据库缓存的数据
此时,刷新页面,控制台不会输出SQL语句,也就是说不再查询数据库,直接使用Redis缓存数据
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
Kafka实战笔记
关于这份笔记,为了不影响大家的阅读体验,我只能在文章中展示部分的章节内容和核心截图
- Kafka入门
- 为什么选择Kafka
- Karka的安装、管理和配置
- Kafka的集群
- 第一个Kafka程序
afka的生产者
- Kafka的消费者
- 深入理解Kafka
- 可靠的数据传递
- Spring和Kalka的整合
- Sprinboot和Kafka的整合
- Kafka实战之削峰填谷
- 数据管道和流式处理(了解即可)
- Kafka实战之削峰填谷
587689)]
Kafka实战笔记
关于这份笔记,为了不影响大家的阅读体验,我只能在文章中展示部分的章节内容和核心截图
[外链图片转存中…(img-3amozRHw-1711955587690)]
- Kafka入门
- 为什么选择Kafka
- Karka的安装、管理和配置
[外链图片转存中…(img-bdbdxdy8-1711955587690)]
- Kafka的集群
- 第一个Kafka程序
- [外链图片转存中…(img-yhcXqFNk-1711955587690)]
afka的生产者
[外链图片转存中…(img-jLuBPV3N-1711955587691)]
- Kafka的消费者
- 深入理解Kafka
- 可靠的数据传递
[外链图片转存中…(img-j7BLiE2o-1711955587691)]
[外链图片转存中…(img-fQUAL7hT-1711955587691)]
- Spring和Kalka的整合
- Sprinboot和Kafka的整合
- Kafka实战之削峰填谷
- 数据管道和流式处理(了解即可)
[外链图片转存中…(img-AVzuFzTH-1711955587692)]
- Kafka实战之削峰填谷
[外链图片转存中…(img-uFJPxWP1-1711955587692)]