推荐文章阅读
Click me to read SpringBoot与缓存 ~ 概念、注解、整合Redis、分布式锁
Click me to read SpringBoot整合缓存 ~ SpringBoot缓存工作原理以及@Cacheable运行流程
Click me to read SpringBoot整合缓存 ~ 整合Redis缓存和序列化
前言
授
人
以
鱼
不
如
授
人
以
渔
,
建
议
大
家
收
藏
该
文
章
,
学
会
分
析
的
方
法
\color{red}授人以鱼不如授人以渔,建议大家收藏该文章,学会分析的方法
授人以鱼不如授人以渔,建议大家收藏该文章,学会分析的方法
刚
看
缓
存
原
理
的
时
候
,
花
了
很
长
时
间
,
还
是
跟
踪
不
到
代
码
,
多
看
了
几
次
资
料
,
便
能
自
主
跟
踪
了
\color{red}刚看缓存原理的时候,花了很长时间,还是跟踪不到代码,多看了几次资料,便能自主跟踪了
刚看缓存原理的时候,花了很长时间,还是跟踪不到代码,多看了几次资料,便能自主跟踪了
缓存工作原理
- 老套路,看CacheAutoConfiguration.java文件
- 缓存配置类,查看导入了哪些类
- 在这么多配置类中,默认生效哪个呢?
方法1. 分析每个类,点击:
以我们熟悉的RedisCacheConfiguration为例:
所以默认情况下,不是redis缓存配置类生效。其他的就这样分析呗
方法2: 直接看启动分析报告:
debug=true
结果是: SimpleCacheConfiguration
4. 定位SimpleCacheConfiguration做了什么
给
容
器
中
注
册
了
一
个
c
a
c
h
e
M
a
n
a
g
e
r
:
C
o
n
c
u
r
r
e
n
t
M
a
p
C
a
c
h
e
M
a
n
a
g
e
r
\color{red}给容器中注册了一个cacheManager:ConcurrentMapCacheManager
给容器中注册了一个cacheManager:ConcurrentMapCacheManager
5、 cacheManager可以获取和创建ConcurrentMapCacheManager类型的缓存组件,他的作用将数据保存在ConcurrentHashMap里面
这
里
是
S
p
r
i
n
g
B
o
o
t
的
缓
存
原
理
,
这
也
就
能
解
释
两
个
问
题
\color{#f6941d}这里是SpringBoot的缓存原理,这也就能解释两个问题
这里是SpringBoot的缓存原理,这也就能解释两个问题
第
一
次
使
用
@
C
a
c
h
e
a
b
l
e
注
解
时
,
根
本
不
需
要
缓
存
组
件
配
置
,
默
认
用
一
个
m
a
p
\color{#f6941d}第一次使用@Cacheable注解时,根本不需要缓存组件配置,默认用一个map
第一次使用@Cacheable注解时,根本不需要缓存组件配置,默认用一个map
每
次
启
动
后
数
据
都
会
消
失
,
没
有
持
久
化
\color{#f6941d}每次启动后数据都会消失,没有持久化
每次启动后数据都会消失,没有持久化
Cacheable运行流程
@Cacheable(cacheNames = {"emp"})
public Employee get(Integer id){
return employeeMapper.selectById(id);
}
1、 方法运行之前,先去查询Cache组件(缓存组件),按照cacheName指定的名字获取,若第一次没有Cache组件会自动创建。
在
C
o
n
c
u
r
r
e
n
t
M
a
p
C
a
c
h
e
M
a
n
a
g
e
r
打
上
断
点
看
到
\color{red}在ConcurrentMapCacheManager打上断点看到
在ConcurrentMapCacheManager打上断点看到
在这里插入图片描述
2、 去Cache中查找缓存的内容,使用一个key,默认就是方法的参数;
key是按照某种策略生成的,默认是使用keyGenerator生成的,默认使用SimpleKeyGenerator生成key
org.springframework.cache.concurrent.ConcurrentMapCache#lookup
3、 没有查询到缓存就会调用目标方法
!](https://img-blog.csdnimg.cn/20201124163804649.png#pic_center)
4、 将目标方法返回的结果,放入缓存中
若lookUp找得到的话,则不进入方法
总结
【
操
作
操
作
再
操
作
,
记
录
记
录
再
记
录
】
\color{red}【操作操作再操作,记录记录再记录】
【操作操作再操作,记录记录再记录】
从
第
一
次
跟
踪
源
码
到
熟
悉
源
码
,
花
了
两
天
的
时
间
,
建
议
大
家
一
定
要
去
跟
踪
四
次
,
不
要
只
看
不
动
手
哦
\color{red}从第一次跟踪源码到熟悉源码,花了两天的时间,建议大家一定要去跟踪四次,不要只看不动手哦
从第一次跟踪源码到熟悉源码,花了两天的时间,建议大家一定要去跟踪四次,不要只看不动手哦
你
知
道
的
越
多
,
你
知
道
的
越
少
!
希
望
对
你
有
帮
助
!
\color{red}你知道的越多,你知道的越少!希望对你有帮助!
你知道的越多,你知道的越少!希望对你有帮助!