前置知识:

  • 在Spring Cache缓存中有两大组件CacheManager和Cache.在整个缓存中可以有多个CacheManager,他们负责管理他们里边的Cache。一个CacheManager中可以创建多个Cache,每个Cache负责存储一个种类数据,例如Salary Cache负责存储Salary相关的数据。

步骤:

一、开启基于注解的缓存功能

在启动类或者其他配置类中加入@EnabeleCaching注解

@SpringBootApplication
@MapperScan("com.xj.springboot.mapper")
@EnableCaching
public class SpringbootCacheApplication { public static void main(String[] args) {
SpringApplication.run(SpringbootCacheApplication.class, args);
} }

二、在方法上标注缓存注解

1.@Cacheable

此注解可以标注在方法上,当第一次调用被@Cacheable注解标注的方法时,该注解会将方法的返回值作为value存入缓存中,如果没有指定key,则key默认值为方法的实参(注意不是形参)。然后再次调用此方法,传入的参数和上一次一样,则不会再执行方法体中的代码,而是直接从缓存中取出数据,然后返回。

cacheable注解中有9个属性:value、cacheNames、key、keyGenerator、cacheManager、cacheResolver、condition、unless、sync。其中value和cacheNames互为别名,所以可以说只有8个属性。

  • value / cacheNames:用于指定Cache的名字,此属性是数组类型,可以指定多个缓存的名字。此属性必须指定,不设置会报错。
  • key:用于指定存放进缓存的数据的key(因为要将当前方法的返回值以key-value的形式存储在缓存中),不设置的话默认就是传入方法的实参的值(注意不是形参),如果要设置通常会使用spEL表达式(spEL可参考下图

    注意:@Cacheable注解的key属性中不能使用#result取出方法执行后的返回值,因为@Cacheable注解是先到缓存中查找,在执行方法的,在没执行方法前,#result是取不到值的。

                

  • keyGenerator:用于指定key的生成器。注意,keyGenerator和key只能同时存在一个,如果设置了key,则不能再设置keyGenerator。
  • cacheManager:指定使用哪个CacheManager(缓存管理器)。springboot的自动配置在容器中添加了一个ConcurrentMapCacheManager类型的cacheManager,如果我们没有指定cacheManager,则默认使用springboot提供的,即ConcurrentMapCacheManager。
  • cacheResolver:作用同cacheManager。
  • condition:用于指定一个表达式,当表达式成立时,才将方法的返回值放入缓存中。表达式通常同spEL表达式来编写。
  • unless:作用与condition属性相反。指定一个表达式,当表达式成立时,方法的返回值将不被放入缓存中。有一点和condition不同,就是unless的表达式中,可以获取到方法的返回值进行判断。
  • sync:是否使用异步模式。如果设置此注解为true(即开启异步模式)unless属性就不能使用了。多线程并发时可启用此属性。

执行流程总结:

 调用方法前,会先拿注解中cacheNames属性指定的名字到缓存中查找有没有该名字的cache,如果有,则直接返回key为方法实参的数据。如果没有,那么就创建名字为cacheNames属性指定的名字的cache,然后执行方法体,将方法的返回结果作为value放到缓存中。

2.@CachePut

此注解可以标注在方法上,当每次调用被@Cacheput注解标注的方法时,该注解会都会将方法的返回值作为value存入缓存中。一般标注在执行数据库更新操作的方法上。

CachePut与Cacheable注解的区别:Cacheable只有在第一次调用方法时才会将方法返回值放到缓存中,再次调用时缓存中有就不会再执行方法体了。而CachePut每次调用方法,都会将方法返回值放入缓存中。

cachePut注解中有9个属性,这9个属性同Cacheable注解的属性使用相同。

3.CacheEvict

cacheevict中evict是驱逐,逐出的意思。所以此注解是用于删除缓存中指定key的数据的。此注解可以标注在方法上,当调用被@CacheEvict注解标注的方法时,该注解会根据 Cacheevict注解中key属性所指定的key去缓存中找到这个key对应的value,然后将它删掉。

Cacheevict注解有9个属性:value、cacheNames、key、keyGenerator、cacheManager、cacheResolver、condition、allEntries、beforeInvocation。其中,前7个属性和@Cacheable中的属性作用是一样的,下边就不再赘述了,只介绍allEntries和beforeInvocation

  • allEntries:当allEntries设置为true时,表示调用当前注解标注的方法会将cacheNames指定的cache中所有的缓存数据全部清除。默认为false
  • beforeInvocation:当beforeInvocation设置为true时,清除缓存数据这个动作会在方法被调用之前执行。默认值为false,即先调用方法,执行方法中的内容,最后执行清除缓存数据的动作。也许你还是疑惑beforeInvocation到底有什么用,清除缓存数据的动作在方法调用之前执行和在方法调用之后执行有什么区别。答案是肯定有区别的,区别就是清除缓存数据的动作在方法调用之后的话,会先执行方法,此时如果方法出现异常,就不会再执行清除缓存数据的动作。而清除缓存数据的动作在方法调用之前,那么不管方法会不会出现异常,清除缓存数据的动作都会执行。

4.@Caching

此注解起始就是Cacheable、CachePut、CacheEvict这三个注解的组合体。此注解适用于缓存复杂的方法上。下边是Caching注解的源码。

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Caching {
Cacheable[] cacheable() default {}; CachePut[] put() default {}; CacheEvict[] evict() default {};
}

5.@CacheConfig

此注解可以标注在类上,用于抽取缓存的公共配置。

如果一个类中的所有方法上的Cacheable、CachePut、CacheEvict这三个注解,他们的都是cacheNames都是指向同一个或者同一批cache的,那么就可以用把@CacheConfig注解这些cacheNames都抽取出来,然后将此注解标注在类上。那么,这个类下边的方法上的缓存相关就都不用再指定cacheNames属性了,都会使用CacheConfig上指定的cacheNames。

Spring Cache缓存技术,Cacheable、CachePut、CacheEvict、Caching、CacheConfig注解的使用的更多相关文章

  1. Spring Cache缓存技术的介绍

    缓存用于提升系统的性能,特别适用于一些对资源需求比较高的操作.本文介绍如何基于spring boot cache技术,使用caffeine作为具体的缓存实现,对操作的结果进行缓存. demo场景 本d ...

  2. Spring Cache缓存注解

    目录 Spring Cache缓存注解 @Cacheable 键生成器 @CachePut @CacheEvict @Caching @CacheConfig Spring Cache缓存注解 本篇文 ...

  3. Spring缓存注解@CachePut , @CacheEvict,@CacheConfig使用

    Cacheable CachePut CacheEvict CacheConfig 开启缓存注解 @Cacheable @Cacheable是用来声明方法是可缓存的.将结果存储到缓存中以便后续使用相同 ...

  4. 注释驱动的 Spring cache 缓存介绍

    概述 Spring 3.1 引入了激动人心的基于注释(annotation)的缓存(cache)技术,它本质上不是一个具体的缓存实现方案(例如 EHCache 或者 OSCache),而是一个对缓存使 ...

  5. [转]注释驱动的 Spring cache 缓存介绍

    原文:http://www.ibm.com/developerworks/cn/opensource/os-cn-spring-cache/ 概述 Spring 3.1 引入了激动人心的基于注释(an ...

  6. 注释驱动的 Spring cache 缓存介绍--转载

    概述 Spring 3.1 引入了激动人心的基于注释(annotation)的缓存(cache)技术,它本质上不是一个具体的缓存实现方案(例如 EHCache 或者 OSCache),而是一个对缓存使 ...

  7. Spring cache 缓存

    概述 Spring 3.1 引入了激动人心的基于注释(annotation)的缓存(cache)技术,它本质上不是一个具体的缓存实现方案(例如 EHCache 或者 OSCache),而是一个对缓存使 ...

  8. Spring Cache缓存框架

    一.序言 Spring Cache是Spring体系下标准化缓存框架.Spring Cache有如下优势: 缓存品种多 支持缓存品种多,常见缓存Redis.EhCache.Caffeine均支持.它们 ...

  9. 【快学SpringBoot】快速上手好用方便的Spring Cache缓存框架

    前言 缓存,在开发中是非常常用的.在高并发系统中,如果没有缓存,纯靠数据库来扛,那么数据库压力会非常大,搞不好还会出现宕机的情况.本篇文章,将会带大家学习Spring Cache缓存框架. 原创声明 ...

随机推荐

  1. YII框架中的srbac权限管理模块的安全与使用(版本是1.1.20)

    0x01 前言 srbac的原理: YII框架的srbac模块是一个专门管理权限的一个模块,那它是怎么管理权限的呢.我们知道YII框架的网页显示是由控制器实现的,控制器继承父类CController和 ...

  2. XCTF-shrine

    shrine 直接看题 进来给了个python代码 import flask import os app = flask.Flask(__name__) app.config['FLAG'] = os ...

  3. 【JavaScript】Leetcode每日一题-二叉搜索树的范围和

    [JavaScript]Leetcode每日一题-二叉搜索树的范围和 [题目描述] 给定二叉搜索树的根结点 root,返回值位于范围 [low, high] 之间的所有结点的值的和. 示例1: 输入: ...

  4. VMware 15 虚拟机黑屏问题

    方法一:关闭加速3D图形 点击虚拟机,右键设置,取消勾选后,再进行重启 方法二:用管理员运行cmd 输入如下命令,要使用管理员运行,然后重启电脑 netsh winsock reset 方法三:换成V ...

  5. mybatis增删改返回的int是-2147482646,并不是想要返回结果

    MyBatis发现更新和插入返回值一直为"-2147482646"的错误是由defaultExecutorType设置引起的,如果设置为batch,更新返回值就会丢失,返回结果就只 ...

  6. QFNU 10-30 training

    7-9 特立独行的幸福 题意:见PTA 思路:其实就是遍历进行查找,利用递归函数,为了解决是特立独行,还要用一个全局数组进行存储所有满足条件的数进行去重标记,最后在输出的时候进行判断是否是只读取过一次 ...

  7. C++ primer plus读书笔记——第6章 分支语句和逻辑运算符

    第6章 分支语句和逻辑运算符 1. 逻辑运算符的优先级比关系运算符的优先级低. 2. &&的优先级高于||. 3. cctype中的函数P179. 4. switch(integer- ...

  8. margin (子元素远离父元素边框)

    如果父盒子没有设置border框着,那么他的子元素无法利用margin-top 来远离父元素的上边框 如果使用了margin-top会使子元素和父元素一起往下移 (子想离,父不设置border边框 则 ...

  9. VSCode配置MSVC+VSCode使用easyx库,2021.5.13日配置

    VSCode配置MSVC+VSCode使用easyx库,2021.5.13日配置~~ 想必很多人和我一样,想用vscode编程c++,easyx库不支持MinGW,一般人都是直接使用vs2019安装e ...

  10. TCP 中的两个细节点

    TCP 超时和重传 没有永远不出错误的通信,这句话表明着不管外部条件多么完备,永远都会有出错的可能.所以,在 TCP 的正常通信过程中,也会出现错误,这种错误可能是由于数据包丢失引起的,也可能是由于数 ...