Springboot中缓存的工作原理

要想在springboot中使用缓存,首先要了解springboot中缓存的工作原理。
我们知道springboot在启动时会有很多的自动配置类(xxx-Autoconfiguration类),当我们要使用缓存时,首先缓存的自动配置类会生效。
1.找到CacheAutoConfiguration类

@Configuration
@ConditionalOnClass({CacheManager.class})
@ConditionalOnBean({CacheAspectSupport.class})
@ConditionalOnMissingBean(value = {CacheManager.class},name = {"cacheResolver"}
)
@EnableConfigurationProperties({CacheProperties.class})
@AutoConfigureBefore({HibernateJpaAutoConfiguration.class})
@AutoConfigureAfter({CouchbaseAutoConfiguration.class, HazelcastAutoConfiguration.class, RedisAutoConfiguration.class})//我们注意到这里的@Import会给容器中导入许多缓存的组件(如redis等等)
@Import({CacheAutoConfiguration.CacheConfigurationImportSelector.class})
public class CacheAutoConfiguration {static final String VALIDATOR_BEAN_NAME = "cacheAutoConfigurationValidator";public CacheAutoConfiguration() {}

2. 缓存的配置类
通过debug启动主程序可以知道导入的缓存组件有
RedisCacheConfiguration
SimpleCacheConfiguration
GenericCacheConfiguration
JCacheCacheConfiguration
EhCacheCacheConfiguration
。。。。
等11种缓存组件,如果我们没有在pom中添加任何的starter,springboot会默认匹配SimpleCacheConfiguration

3.SimpleCacheConfiguration做了什么呢?
SimpleCacheConfiguration给容器中注册了一个缓存管理器cacheManager,用来管理缓存的获取和创建,并把数据保存在concurrentMap中。 如下代码

 @Bean//注册了一个缓存管理器public ConcurrentMapCacheManager cacheManager() {ConcurrentMapCacheManager cacheManager = new ConcurrentMapCacheManager();List<String> cacheNames = this.cacheProperties.getCacheNames();//获取缓存的名字,如果为空则新建,新建的name为我们定义的if (!cacheNames.isEmpty()) {cacheManager.setCacheNames(cacheNames);}return (ConcurrentMapCacheManager)this.customizerInvoker.customize(cacheManager);}

4.具体实现(不使用redis时)
4.1 首先在主启动类中加入开启缓存注解

@SpringBootApplication
@EnableScheduling  //开启定时任务
@EnableCaching  //开启缓存
@MapperScan(basePackages = {"com.example.demo.mapper"})
public class DemoApplication {SpringApplication.run(DemoApplication.class, args)
}

4.2 在需要开启缓存的地方加入 @Cacheable

    @Cacheable(cacheNames = {"emp"})   //当前查询运用了缓存@Overridepublic User getUserById(Integer id) {User user = userMapper.selectByPrimaryKey(id);return  user;}

缓存的几个重要注解


示例:

 @Transactional(readOnly = false)@CacheEvict(value = "user",key="'user_'+#user.userId",allEntries=false,beforeInvocation=true)public int updateBuyer(User user,Buyer buyer) {int i =  userMapper.updateByPrimaryKeySelective(user);return i;}//注意:如果是删除,尽量加上beforeInvocation=true,保证在方法执行前就清空缓存

5.@Cacheable运行流程
5.1 方法运行之前,先去查询缓存,根据缓存的名字去获取,如果第一次获取没有这个对应名称的缓存,则会自动创建缓存组件。
5.2 在缓存中使用key-value的形式来存储和查找数据
key是按照某种策略生成的,是可以自定义生成方式的
5.3 没有查到缓存就调用目标方法
5.4 将目标方法返回的结果,放进缓存中

6在使用@CachePut时要注意 它即调用方法,有更新缓存
运行时机 :先调用目标方法,再将目标方法放进缓存
在设计key时 :
1.key = “#employee.id” 使用传入的员工id
2.key = “#result.id” 使用返回后的id
两者都可以,
但是@Cacheable 不能用“#result.id”

springboot中缓存技术的使用、原理及其运行流程相关推荐

  1. 【SpringBoot】面试必杀技-泰山陨石坠,SpringBoot中主启动类的run方法启动流程是什么?

    开头导语由Chatgpt完成 当今互联网行业中,Java后端开发岗位的竞争异常激烈,对于面试者来说,掌握一些技巧和知识点将有助于脱颖而出.而对于SpringBoot框架的使用和运行机制,更是Java后 ...

  2. MR的原理和运行流程

    文章目录 MR的原理和运行流程 Map的运行过程 Reduce处理过程 Shuffle过程 MR运行过程 Yarn && Job MR的原理和运行流程 Map的运行过程 以HDFS上的 ...

  3. springboot的缓存技术

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 我门知道一个程序的瓶颈在于数据库,我门也知道内存的速度是大大快于硬盘的速度的.当我门需要重复的获取相 ...

  4. SpringBoot中缓存的应用

    1.为什么引入缓存? 主要是因为系统中有些接口速度比较慢,其实是sql比较慢(如果想从根本上解决问题的话,其实应该是优化我们的sql),这时候引入缓存可以大大提高响应速度 2.加入缓存带来的问题? 用 ...

  5. SSM框架中MVC各层的作用以及运行流程

    这篇博文主要介绍的是SSM(Spring.SpringMVC.Mybatis)框架中,MVC各层的作用以及各层之间的交互和框架整体运行流程. 一.MVC各层级间的作用及关系 表现层(springMVC ...

  6. 计算机网络中缓存技术,编程达人

    计算机缓存也就是通常说的Cache,对计算机编程有所了解的应该都知道,缓存常与Redis联系在一起,但是Redis仅仅是应用中的一部分. 1.浏览器缓存 浏览器面对的问题是网络访问的速度远远低于本地访 ...

  7. 星星之火-43:无线通信中复用技术的物理原理---空间复用、时分多址TDM、频分复用FDM、正交频分复用OFDM、空分复用MIMO、码分复用CDM

    目录 1. 无线通信的基本原理 2. 空间复用--小区制 3. 时分复用--TDM 4. 频分复用--FDM:区分有保护间隔的不同频点的频谱 5. 正交频分复用--OFDM:区分部分重叠的不同频点的子 ...

  8. mybatis中缓存的设计与原理

    缓存是基于装饰器设计模式来设计的,接口为Cache,实现类为PerpetualCache,具体的装饰器有基于淘汰策略的.对象引用类型的.序列化的.事务的.同步的.日志的(记录缓存命中率).时间调度的. ...

  9. DLP投影机投影技术之成像原理与工作流程

    DLP是数字光处理(Digital Light Processing)的缩写,是一项使用于投影仪和背投电视中的显像技术. DLP投影仪成像原理         DLP投影仪的成像原理是将通过UHP灯泡 ...

最新文章

  1. 刘涵 美国 西北大学 计算机,西北大学关于表彰2010-2011学年度学生先进集体-红帆.doc...
  2. Hadoop 资源列表
  3. sublime-text3按tab跳出括号
  4. Android 多状态加载布局的开发 Tips
  5. 1. 变量和基本类型
  6. 【中山市选2009】【BZOJ2463】谁能赢呢?
  7. memcached mysql 同步,mysql中使用UDF自动同步memcached效率笔记
  8. jstree静态生成树并为树添加触发事件
  9. java设置http超时时间_Java设置Http请求超时时间
  10. python win32 窗口截图
  11. mysql preparedstatement_关于PreparedStatement你知道多少
  12. matlab 梯度下降 求偏导,通过计算图求梯度下降中各偏导的推导
  13. tinymce vue 部分工具不显示_vue项目中使用tinymce编辑器的步骤详解
  14. Inno Setup打包添加和去除管理员权限
  15. python语言中ch用法_pytorch 中pad函数toch.nn.functional.pad()的用法
  16. 免费打造自己的个人网站,免费域名、免费空间、FTP、数据库什么的,一个不能少,没钱,也可以这么任性...
  17. MarkDown语法详解:标题、字体、列表、引用、图片、表格、代码、超链接、公式
  18. Spanish FF Live Support
  19. 【PTA】 试试手气
  20. 计算机主机内部的除尘课件,计算机主机内部除尘装置

热门文章

  1. 电大计算机机考excel,中央电大计算机应用机考excel电子表格模板题库存(118页)-原创力文档...
  2. Spring重点面题总结
  3. seata不兼容mysql8的解决方案
  4. csgo 机器人模式_分享一个休闲模式机器人Bug
  5. pythonqueue线程_python之线程queue
  6. 前端JavaScript之BOM与DOM
  7. 走近伏羲,谈5000节点集群调度与性能优化
  8. Java图形界面设计——substance皮肤
  9. (转载)查看Oracle字符集及怎样修改字符集
  10. go依赖管理-govendor