原理

从Spring3.1开始,Spring框架提供了对Cache的支持,提供了一个对缓存使用的抽象,通过在既有代码中添加少量它定义的各种 annotation,即能够达到缓存方法的返回对象的作用。提供的主要注解有@Cacheable、@CachePut、@CacheEvict和@Caching,具体见下表:

注解 说明
@Cacheable 可以标注在类或方法上:标注在方法上表示该方法支持数据缓存;标在类上表示该类的所有方法都支持数据缓存。
具体功能:在执行方法体之前,检查缓存中是否有相同key值的缓存存在,如果存在对应的缓存,直接返回缓存中的值;如果不存在对应的缓存,则执行相应的方法体获取数据,并将数据存储到缓存中。
@CachePut 可以标注在类或方法上,表示支持数据缓存。
具体功能:在方法执行前不会检查缓存中是否存在相应的缓存,而是每次都会执行方法体,并将方法执行结果存储到缓存中,如果相应key值的缓存存在,则更新key对应的value值。
@CacheEvict 可以标注在类或方法上,用于清除相应key值的缓存。
@Caching 可以标注在类或方法上,它有三个属性cacheable、put、evict分别用于指定@Cacheable、@CachePut和@CacheEvict

当需要在类上或方法上同时使用多个注解时,可以使用@Caching,如:

@Caching(cacheable=@Cacheable("User"), evict = {@CacheEvict("Member"), @CacheEvict(value = "Customer", allEntries = true)})

@Cacheable的常用属性及说明如下表所示:

@Cacheable属性 说明
key 表示缓存的名称,必须指定且至少要有一个值,比如:@Cacheable(value=“Dept”)或@Cacheable(value={“Dept”,“Depts”})
condition 表示是否需要缓存,默认为空,表示所有情况都会缓存。通过SpEL表达式来指定,若condition的值为true则会缓存,若为false则不会缓存,如@Cacheable(value=“Dept”,key="‘deptno_’+# deptno “,condition=”#deptno<=40")
value 表示缓存的key,支持SpEL表达式,如@Cacheable(value=“Dept”,key="‘deptno_’ +#deptno"),可以不指定值,如果不指定,则缺省按照方法的所有参数进行组合。除了上述使用方法参数作为key之外,Spring还提供了一个root对象用来生成key,使用方法如下表所示,其中"#root"可以省略。

Root对象

Root对象 说明
methodName 当前方法名,比如#root.methodName
method 当前方法,比如#root.method.name
target 当前被调用的对象,比如#root.target
targetClass 当前被调用的对象的class,比如#root.targetClass
args 当前方法参数组成的数组,比如#root.args[0]
caches 当前被调用的方法使用的缓存,比如#root.caches[0].name

@CachePut的常用属性同@Cacheable。@CacheEvict的常用属性如下表所示:

@CacheEvict属性 说明
value 表示要清除的缓存名
key 表示需要清除的缓存key值,
condition 当condition的值为true时才清除缓存
allEntries 表示是否需要清除缓存中的所有元素。默认为false,表示不需要,当指定了allEntries为true时,将忽略指定的key。
beforeInvocation 清除操作默认是在方法成功执行之后触发的,即方法如果因为抛出异常而未能成功返回时不会触发清除操作。使用beforeInvocation可以改变触发清除操作的时间,当该属性值为true时,会在调用该方法之前清除缓存中的指定元素。

示例:设置当 dname 的长度大于3时才缓存

//条件缓存
@ResponseBody
@GetMapping("/getLocByDname")
@Cacheable(cacheNames = "dept", key = "#dname", condition = "#dname.length()>3")
public String getLocByDname(@RequestParam("dname") String dname) {//key动态参数QueryWrapper<Dept> queryMapper = new QueryWrapper<>();queryMapper.eq("dname", dname);Dept dept = deptService.getOne(queryMapper);return dept.getLoc();
}

示例:unless 即条件不成立时缓存。#result 代表返回值,意思是当返回码不等于 200 时不缓存,也就是等于 200 时才缓存。

@ResponseBody
@GetMapping("/getDeptByDname")
@Cacheable(cacheNames = "dept", key = "#dname", unless = "#result.code != 200")
public Result<Dept> getDeptByDname(@RequestParam("dname") String dname){//key动态参数QueryWrapper<Dept> queryMapper = new QueryWrapper<>();queryMapper.eq("dname", dname);Dept dept = deptService.getOne(queryMapper);if (dept == null)return ResultUtil.error(120, "dept is null");elsereturn ResultUtil.success(dept);
}

使用Spring Cache设置缓存条件相关推荐

  1. Spring Cache抽象-缓存注解

    文章目录 概述 Spring缓存的基本原理 @Cacheable :主要针对方法配置,能够根据方法的请求参数对其结果进行缓存 键生成器 带条件的缓存 @Cacheable 注解参数说明 示例-缓存管理 ...

  2. spring Cache /Redis 缓存 + Spring 的集成示例

    spring Cache https://www.ibm.com/developerworks/cn/opensource/os-cn-spring-cache/ spring+redis 缓存 ht ...

  3. Spring Cache抽象-缓存管理器

    概述 SimpleCacheManager NoOpCacheManager ConcurrentMapCacheManager CompositeCacheManager 概述 CacheManag ...

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

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

  5. 注解驱动的 Spring cache 缓存介绍

    概述 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. Spring 3.1 引入了激动人心的基于注释(annotation)的缓存(cache)技术 ...

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

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

  7. Spring Boot————默认缓存应用及原理

    引言 应用程序的数据除了可以放在配置文件中.数据库中以外,还会有相当一部分存储在计算机的内存中,这部分数据访问速度要快于数据库的访问,因此通常在做提升数据访问速度时,会将需要提升访问速度的数据放入到内 ...

  8. 使用spring cache和ehcache之前必须了解的

    好长时间没写博客了,真的是没时间啊.ps:其实就是懒!!接下来几篇要写下缓存,这里主要写下ehcache与spring整合的内容,包括aop形式的缓存,基于注解的缓存,页面缓存这三方面吧.在这之前先要 ...

  9. springcache使用笔记001_注释驱动的 Spring cache 简单使用

    spring的缓存介绍: Spring 3.1 引入了基于注释(annotation)的缓存(cache)技术,它本质上不是一个具体的缓存实现方案(例如 EHCache 或者 OSCache),而是一 ...

  10. spring cache基础篇

    Spring从3.1开始定义了org.springframework.cache.Cache和 org.springframework.cache.CacheManager接口来统一不同的缓存技术:并 ...

最新文章

  1. spring使用回顾
  2. ASP:关于生成HTML文件的新闻系统
  3. LeetCode Algorithm 103. 二叉树的锯齿形层序遍历
  4. URAL 1036 Lucky Tickets
  5. mysql数据库的目录_了解MySQl数据库目录
  6. pat 乙级 1011 A+B 和 C(C++)
  7. 牛客网-数据结构笔试题目(一)-猫咪特征提取思路解析(附源码)
  8. [zz from newsmth] 王大牛的Memory Model reading list
  9. oracle分区表学习及应用
  10. .NET实现之(自动更新
  11. for /r命令实现全盘搜索指定文件
  12. Dell交换机在配置中应注意的几个问题!
  13. excel字符串和单元格拼接_Excel单元格内计算式及字符串拼接实现
  14. 火灾原来离我们那么近
  15. springboot + redis(单机版)
  16. 【软件测试】:测试改进措施总结
  17. 传智2018python15期_2018年传智播客黑马python+人工智能15期
  18. 内网渗透建立代理通道(如何攻击目标内网机器?)-Socks代理(゚益゚メ) 渗透测试
  19. SQL零基础入门学习(十三)
  20. MATLAB学习系列--绘制函数曲线

热门文章

  1. 如何登录锐捷设备(业务软件篇)
  2. c++中string 各种函数的函数用法
  3. JS 解决IE浏览器出现Automation 服务器不能创建对象
  4. 笔记本win7系统关闭触摸板功能的方法
  5. 根据银行卡号查询银行名接口目前免费阿里接口
  6. 游戏后台开发九问(腾讯技术分享实录)
  7. SAP结转方法:表结法、帐结法
  8. IdentityServer4 去掉验证
  9. MyBatis - 使用@Param注解解决mybatis方法传入多参数时的报错问题
  10. 超简单的C语言贪吃蛇(附源码)