前置知识:

  • 在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. C#-DUP

    void jianting() { int port = 8888; UdpClient udpclient = new UdpClient(port); IPEndPoint ipendpoint ...

  2. <JVM上篇:内存与垃圾回收篇>02-类加载子系统

    笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...

  3. php基础-php基本语法

    http://study.163.com/course/courseMain.htm?courseId=246003

  4. Python爬虫基础讲解(七):xpath的语法

    xpath语法 XPath使用路径表达式来选取XML文档中的节点或者节点集.这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似. 下面列出了最有用的表达式: 在下面的表格中,我们已列出了一 ...

  5. 关于flask的模板注入的学习

    flask模板注入的学习 关于flask模版注入,之前不太理解,看了很多文章才弄懂,主要原理就是渲染函数的参数用户可控就造成了模板注入 就会使用户构造恶意的代码进行逃逸从而进行攻击 flask模板渲染 ...

  6. [bug] Flask:jinja2.exceptions.UndefinedError: 'None' has no attribute 'id'

    问题 Python Flask做的购物网站,添加购物车时,提示错误 解决 检查发现是MySQL中不正常的空数据导致,删除此条记录即可 参考 https://www.jb51.cc/python/186 ...

  7. traceroute排查网络故障 www.qq.com排查网络故障网络不通 先ping自己

    网络不通 先ping自己 在ping网关 再ping外网 再ping别人的ip 背景需求 Linux 因为其强大的网络处理能力,被广泛用于网关(实例链接)和服务器(实例链接).实际工作中,快速排查这些 ...

  8. head tail diff -c fff hhh 前5行 后5行 区别 动态显示文本最新信息: $tail -f crawler.log

    显示文件第一行: $head -1 filename 显示文件倒数第五行: $tail -5 filename ]# tail -5 test.py option=sys.argv[1] main(o ...

  9. Linux_配置认证访问FTP服务

    [RHEL8]-FTPserver:[Centos8]-FTPclient !!!测试环境我们首关闭防火墙和selinux(FTPserver和FTPclient都需要) [root@localhos ...

  10. 056.Python前端Django模型ORM多表基本操作

    一 准备工作 1.1 新建一个项目 root@darren-virtual-machine:~# cd /root/PycharmProjects/ root@darren-virtual-machi ...