SpringBoot整合缓存 ~ SpringBoot缓存工作原理以及@Cacheable运行流程

132 阅读1分钟

推荐文章阅读

Click me to read SpringBoot与缓存 ~ 概念、注解、整合Redis、分布式锁

Click me to read SpringBoot整合缓存 ~ SpringBoot缓存工作原理以及@Cacheable运行流程

Click me to read SpringBoot整合缓存 ~ 整合Redis缓存和序列化

Click me to download

前言

授人以鱼不如授人以渔,建议大家收藏该文章,学会分析的方法\color{red}授人以鱼不如授人以渔,建议大家收藏该文章,学会分析的方法 刚看缓存原理的时候,花了很长时间,还是跟踪不到代码,多看了几次资料,便能自主跟踪了\color{red}刚看缓存原理的时候,花了很长时间,还是跟踪不到代码,多看了几次资料,便能自主跟踪了

缓存工作原理

  1. 老套路,看CacheAutoConfiguration.java文件 在这里插入图片描述
  2. 缓存配置类,查看导入了哪些类 在这里插入图片描述 在这里插入图片描述在这里插入图片描述
  3. 在这么多配置类中,默认生效哪个呢? 方法1. 分析每个类,点击: 在这里插入图片描述 以我们熟悉的RedisCacheConfiguration为例: 在这里插入图片描述 所以默认情况下,不是redis缓存配置类生效。其他的就这样分析呗 方法2: 直接看启动分析报告:

debug=true

在这里插入图片描述 结果是: SimpleCacheConfiguration 4. 定位SimpleCacheConfiguration做了什么 给容器中注册了一个cacheManagerConcurrentMapCacheManager\color{red}给容器中注册了一个cacheManager:ConcurrentMapCacheManager 在这里插入图片描述 5、 cacheManager可以获取和创建ConcurrentMapCacheManager类型的缓存组件,他的作用将数据保存在ConcurrentHashMap里面 在这里插入图片描述 这里是SpringBoot的缓存原理,这也就能解释两个问题\color{#f6941d}这里是SpringBoot的缓存原理,这也就能解释两个问题 第一次使用@Cacheable注解时,根本不需要缓存组件配置,默认用一个map\color{#f6941d}第一次使用@Cacheable注解时,根本不需要缓存组件配置,默认用一个map 每次启动后数据都会消失,没有持久化\color{#f6941d}每次启动后数据都会消失,没有持久化

Cacheable运行流程

@Cacheable(cacheNames = {"emp"})
	public Employee get(Integer id){
		return employeeMapper.selectById(id);
	}

1、 方法运行之前,先去查询Cache组件(缓存组件),按照cacheName指定的名字获取,若第一次没有Cache组件会自动创建。 ConcurrentMapCacheManager打上断点看到\color{red}在ConcurrentMapCacheManager打上断点看到 在这里插入图片描述 在这里插入图片描述 2、 去Cache中查找缓存的内容,使用一个key,默认就是方法的参数; key是按照某种策略生成的,默认是使用keyGenerator生成的,默认使用SimpleKeyGenerator生成key

org.springframework.cache.concurrent.ConcurrentMapCache#lookup

在这里插入图片描述

3、 没有查询到缓存就会调用目标方法 !](img-blog.csdnimg.cn/20201124163…)

4、 将目标方法返回的结果,放入缓存中 在这里插入图片描述

若lookUp找得到的话,则不进入方法

在这里插入图片描述

总结

【操作操作再操作,记录记录再记录】\color{red}【操作操作再操作,记录记录再记录】 从第一次跟踪源码到熟悉源码,花了两天的时间,建议大家一定要去跟踪四次,不要只看不动手哦\color{red}从第一次跟踪源码到熟悉源码,花了两天的时间,建议大家一定要去跟踪四次,不要只看不动手哦 你知道的越多,你知道的越少!希望对你有帮助!\color{red}你知道的越多,你知道的越少!希望对你有帮助!