推荐文章阅读
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}你知道的越多,你知道的越少!希望对你有帮助! 你知道的越多,你知道的越少!希望对你有帮助!