Spring Cache缓存技术,Cacheable、CachePut、CacheEvict、Caching、CacheConfig注解的使用
前置知识:
- 在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注解的使用的更多相关文章
- Spring Cache缓存技术的介绍
缓存用于提升系统的性能,特别适用于一些对资源需求比较高的操作.本文介绍如何基于spring boot cache技术,使用caffeine作为具体的缓存实现,对操作的结果进行缓存. demo场景 本d ...
- Spring Cache缓存注解
目录 Spring Cache缓存注解 @Cacheable 键生成器 @CachePut @CacheEvict @Caching @CacheConfig Spring Cache缓存注解 本篇文 ...
- Spring缓存注解@CachePut , @CacheEvict,@CacheConfig使用
Cacheable CachePut CacheEvict CacheConfig 开启缓存注解 @Cacheable @Cacheable是用来声明方法是可缓存的.将结果存储到缓存中以便后续使用相同 ...
- 注释驱动的 Spring cache 缓存介绍
概述 Spring 3.1 引入了激动人心的基于注释(annotation)的缓存(cache)技术,它本质上不是一个具体的缓存实现方案(例如 EHCache 或者 OSCache),而是一个对缓存使 ...
- [转]注释驱动的 Spring cache 缓存介绍
原文:http://www.ibm.com/developerworks/cn/opensource/os-cn-spring-cache/ 概述 Spring 3.1 引入了激动人心的基于注释(an ...
- 注释驱动的 Spring cache 缓存介绍--转载
概述 Spring 3.1 引入了激动人心的基于注释(annotation)的缓存(cache)技术,它本质上不是一个具体的缓存实现方案(例如 EHCache 或者 OSCache),而是一个对缓存使 ...
- Spring cache 缓存
概述 Spring 3.1 引入了激动人心的基于注释(annotation)的缓存(cache)技术,它本质上不是一个具体的缓存实现方案(例如 EHCache 或者 OSCache),而是一个对缓存使 ...
- Spring Cache缓存框架
一.序言 Spring Cache是Spring体系下标准化缓存框架.Spring Cache有如下优势: 缓存品种多 支持缓存品种多,常见缓存Redis.EhCache.Caffeine均支持.它们 ...
- 【快学SpringBoot】快速上手好用方便的Spring Cache缓存框架
前言 缓存,在开发中是非常常用的.在高并发系统中,如果没有缓存,纯靠数据库来扛,那么数据库压力会非常大,搞不好还会出现宕机的情况.本篇文章,将会带大家学习Spring Cache缓存框架. 原创声明 ...
随机推荐
- SqlServer 数据库配置远程桌面
1.是否开启远程桌面,1表示关闭,0表示开启 EXEC master..xp_regread 'HKEY_LOCAL_MACHINE','SYSTEM\CurrentControlSet\Contro ...
- Win64 驱动内核编程-34.对抗与枚举MiniFilter
对抗与枚举MiniFilter MiniFilter 是目前杀毒软件用来实现"文件系统自我保护"和"文件实时监控"的方法. 由于 MiniFilter 模型简单 ...
- (1) arm 指令格式
arm 指令的基本格式如下: <opcode>{<cond>}{S}{.W\.N} <Rd>,<Rn>{,<operand2>} opcod ...
- [CTF]盲文对照表
[CTF]盲文对照表 摘自:https://wenku.baidu.com/view/28b04fd380eb6294dd886ca7.html 学点盲文 盲文又称点字,国际通用的点字由6个凸起的圆点 ...
- Could not contact [localhost:8005]. Tomcat may not be running.
出错环境介绍: Tomcat-version:8.5.56 JDK-version:1.8.0_152 Linux:CentOS-7 错误信息 sh /opt/apache-tomcat-8.5.56 ...
- 简述MySQL优化
数据库的优化可以从四个方面来优化: 1.结构层: web服务器采用负载均衡服务器,mysql服务器采用主从复制,读写分离 2.储存层: 采用合适的存储引擎,采用三范式 3.设计层: 采用分区分表,索引 ...
- h5实现电子签名
前端需要引入:jSignature.min.js ,jquery-1.9.1.min.js前端 部分写法:body内加 <div id="signature">< ...
- c#私钥加密统一JAVA
public static string RSADecryptByPavKey(string pavKey,string strEncryptString) { string clearText = ...
- FFmpeg应用实践之命令查询
0. 前言 FFmpeg 中常用的工具有三个,分别是多媒体编解码工具ffmpeg.多媒体内容分析工具ffprobe和多媒体播放器ffplay.本文介绍的指令都是与编解码工具 ffmpeg 相关的. 学 ...
- 5Spring动态代理开发小结
5Spring动态代理开发小结 1.为什么要有动态代理? 好处 1.利于程序维护 2.利于原始类功能的增强 3.得益于JDK或者CGlib等动态代理技术使得程序扩展性很强 为什么说使得程序扩展性很强? ...