参考:https://blog.csdn.net/qq_38974634/article/details/80650810

一、JSR107

Java Caching 定义5个核心的接口,分别是CachingProvider、CacheManager、Cache、Entity 和 Expiry

1.CachingProvider 定义了创建、配置、获取、管理和控制多个CacheManager ,一个应用可以在运行期间访问多个CachingProvider.

2.CacheManager 定义了创建、配置、获取、管理和控制多个唯一命名的Cache,这些Cache 存在于CacheManager 的上下文,一个CacheManager 仅被一个CachingProvider 所拥有。

3.Cache 是一个类似Map 的数据结构并临时存储以key 为索引的值。一个cache 仅被一个 cacheManager 所拥有。

4.Entitry 是一个存储在Cache 中的 key-value 对

5.Expiry 每一个存储在 Cache 中的条目有一个定义的有效期。一旦超过这个时间,条目为过期状态。一旦过期,条目将不可访问、更新、删除。缓存有效期可以通过ExpiryPolicy 设置。

二、Spring 缓存抽象

Spring 从 3.1 开始定义了 org.springframework.cache.Cache 和 org.springframework.cache.CacheManager 接口来统一不同的缓存技术。并支持使用 JCache (JSR-107)

注解简化开发。

1. Cache 接口下 Spring 提供了各种 xxxCache 的实现,如 RedisCache,EhCache,ConcurrentMapCache 等。每次调用需要缓存功能的方法时,

 Spring 会检查指定参数的的指定的目标方法是否已经被调用过。 如果有就直接从缓存中获取方法调取后的结果。如果没有就调用方法并缓存

 结果返回给用户。下次直接从缓存中获取。

2. 使用缓存,需要注意

  (1).确定方法需要被缓存以及他们的缓存策略

  (2).从缓存中读取之前缓存的数据

三、缓存注解

同样支持 SPEL 表达式

四、缓存的使用

1.导入 spring-boot-starter-cache

2.@EnableCaching 开启缓存

3.使用缓存注解

@Cacheable 能够根据方法的请求参数对其进行缓存

  cacheNames 缓存的名称,听过缓存的名称来标识不同的组件

@CachePut  即调用方法,同时更新数缓存数据,操作玩该方法后将返回值更新到缓存

@CacheEvict  清除缓存  key 指定要清除的缓存  allEntries=true 指定清除缓存中的所有数据,beforeInvocation=false 缓存的清除是否再方法之前前

//@CachePut 刷新数据,前判断数据是存在的,否则缓存可能刷新出数据库不存在的数据

五、spring boot 中默认的缓存

1.将方法的运行结果进行缓存,cacheManager 管理多个cache 组件,对缓存的真正CURD 操作在Cache 组件中,每个缓存组件都有自己唯一的名字。

2.断点跟踪默认配置

默认SimpleCacheConfiguration 生效

3.给容器注册一个CacheManager  : ConcurrentMapCacheManager

4.获取和创建 ConcurrentMapCache 类型的缓存组件,作用是将数据保存在ConcurrentMap中。

5.运行流程: 方法运行前,先去查询 Cache(缓存组件),按照 CacheNames 指定的名字获取,第一次回去缓存如果没有Cache 组件会自动创建;

去Cache 中查询缓存的内容,使用一个key ,默认的就是方法的参数,key 是按照某种策略生成的。默认是使用 keyGenerator 生成的,默认使用SimpleKeyGenerator 生成key.

SimpleKeyGenerator 生成的key 的默认策略:如果没有参数Lkey = new SimpleKey(); 如果有一个参数: key = 参数的值;如果有多个参数: key = new SimpleKey(params);

没有查询到缓存就调用目标方法,将目标方法返回值放入缓存。

@Cacheable 标注的方法执行之前先来检查缓存中有没有这个数据,默认按照参数值作为key去查询缓存,如果没有就运行方法并将结果放入缓存,以后再来调用就可以直接使用缓存的数据。

最新文章

  1. Hadoop生态系统如何选择搭建
  2. 重温WCF之数据契约和序列化(四)
  3. C++的头文件和实现文件分别写什么
  4. spring 解析配置文件问题
  5. 说说log4cplus
  6. 关于this
  7. Android 四种启动模式 已看晕
  8. JavaScript中的数组
  9. Ionic3 编程-应用启动进入引导页
  10. xls到xml
  11. php常用函数搜集
  12. 变量的值与判断的结果有关,使用Set Variable If
  13. thinkphp 3.2 加载第三方库 第三方命名空间库
  14. 【转】Principles of training multi-layer neural network using backpropagation
  15. oracle 函数的返回值与out参数
  16. MyBatis入门程序之mapper映射文件常用配置命令
  17. Linux设备驱动剖析之SPI(二)
  18. java获取系统当前服务器IP地址
  19. 【python】\\u的字符编码问题
  20. mysq5.7

热门文章

  1. 用Fiddler实现手机抓包
  2. Java日期时间API系列21-----Jdk8中java.time包中的新的日期时间API类,xk-time时间转换,计算,格式化,解析的工具
  3. JavaScript - what is "this"? this是什么?
  4. 02-Spring的IOC示例程序(通过id获取对象)
  5. 《如何增加资本约见》---创业学习---训练营第四课---HHR---
  6. Java将数据进行分组处理
  7. php的分层思想
  8. Coursera-吴恩达机器学习课程笔记-Week3
  9. Python中注释与声明
  10. DOCK-SWARM