文章目录

  • 导读
  • 概述
  • 注解@Cacheable 和@CachePut
    • 表达式值的引用
  • 注解@CacheEvict
  • 案例

导读

Spring-Cache手札

Spring Cache抽象-缓存注解

实战-Redis-20Spring缓存机制整合Redis

关于Spring Cache以及注解,之前总结了几篇。现在我们再来细化下


概述

注解 描述
@Cacheable 表明在进入方法之前, Spring 会先去缓存服务器中查找对应 key 的缓存值,如果找到缓存值,那么 Spring 将不会再调用方法,而是将缓存值读出,返回给调用者;如果没有找到缓存值,那么 Spring 就会执行你的方法,将最后的结果通过 key 保存到缓存服务器中
@CachePut Spring 会将该方法返回的值缓存到缓存服务器中,这里简要注意的是, Spring 不会事先去缓存服务器中查找,而是直接执行方法,然后缓存。换句话说,该方法始终会被 Spring 所调用
@CacheEvict 移除缓存对应的 key 的值
@Caching 这是一个分组注解,它能够同时应用于其他缓存的注解
  • 注解@Cacheable 和@CachePut 都可以保存缓存键值对,只是它们的方式略有不同, 请注意二者的区别,它们只能运用于有返回值的方法中
  • 而删除缓存 key 的@CacheEvict 则可以用在 void 的方法上,因为它并不需要去保存任何值 。
  • 上述注解都能标注到类或者方法之上,如果放到类上,则对所有的方法都有效,如果放到方法上,则只是对方法有效。
  • 在大部分情况下,会放置到方法上。 @Cacheable 和 @CachePut 可以配置的属性接近。
  • 一般而言,对于查询,我们会考虑使用@Cacheable
  • 对于插入和修改,考虑使用@CachePut
  • 对于删除操作,我们会考虑使用@CacheEvict。

注解@Cacheable 和@CachePut

因为@Cacheable 和@CachePut 两个注解的配置项 比较接近,所以这里就将这两个注解一并来看

属性 配置类型 说明
value String[] 使用缓存的名称
condition String Spring 表达式,如果表达式返回值为 false,则不会将缓存应用到方法上, true 则会
key String Spring 表达式,可以通过它来计算对应缓存的 key
unless String Spring 表达式,如果表达式返回值为 true,则不会将方法的结果放到缓存上

value 和 key 这两个属性使用得最多,所以先来讨论这两个属性。

value 是一个数组,可以引用多个缓存管理器.

案例----->https://blog.csdn.net/yangshangwei/article/details/82961772#Service_664

如上代码所示定义redisCacheManager后就可以引用它了,而对于 key 则是缓存中的键,它支持 Spring 表达式,通过 Spring 表达式就可以自定义缓存的 key。


表达式值的引用

Spring 表达式和缓存注解之间的约定,通过这些约定去引用方法的参数和返回值的内容,使得其注入 key 所定义的 Spring 表达式的结果中。

表达式 描述 备注
#root.args 定义传递给缓存方法的参数 不常用,暂不讨论
#root.caches 该方法执行是对应的缓存名称,它是一个数组 不常用,暂不讨论
#root.target 执行缓存的目标对象 不常用,暂不讨论
#root.targetClass 目标对象的类,它是#root.target.class 的缩写 不常用,暂不讨论
#root.method 缓存方法 不常用,暂不讨论
#root.methodName 缓存方法的名称,它是#root.method.name 的缩写 不常用,暂不讨论
#result 方法返回结果值,还可以使用 Spring 表达式进一步读取其属性 请注意该表达式不能用于注解@Cacheable,因为该注解的方法可能不会被执行,这样返回值就无从谈起了
#Argument 任意方法的参数,可以通过方法本身的名称或者下标去定义 比如 getRole(Long id)方法,想读取 id 这个参数,可以写为#id,或者#a0、#p0,建议写为#id,可读性高

这样就方便使用对应的参数或者返回值作为缓存的 key 了。


注解@CacheEvict

注解@CacheEvict 主要是为了移除缓存对应的键值对,主要对于那些删除的操作,先来了解它存在哪些属性。

属性 配置类型 说明
value String[] 要使用缓存的名称
key String Spring 表达式,可以通过它来计算对应缓存的 key
condition String Spring 表达式,如果表达式返回值为 false,则不会将缓存应用到方法上, true 则会
allEntries boolean 如果为 true,则删除特定缓存所有键值对,默认值为 false,请注意它将消除所有缓存服务器的缓存,这个属性慎用
beforelnvocation boolean 指定在方法前后移除缓存,如果指定为 true,则在方法前删除缓存:如果为 false,则在方法调用后删除级存,默认值为 false
  • value 和 key 与之前的@Cacheable 和@CachePut 是一致的。
  • 属性 allEntries 要求删除缓存服务器中所有的缓存,这个时候指定的 key 将不会生效,所以这个属性要慎用
  • beforeInvocation 属性指定缓存在方法前或者方法后移除。

案例

Spring缓存机制整合Redis

package com.artisan.ssm_redis.service.impl;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;import com.artisan.ssm_redis.dao.RoleDao;
import com.artisan.ssm_redis.domain.Role;
import com.artisan.ssm_redis.service.RoleService;@Service
public class RoleServiceImpl implements RoleService {// 自动注入@Autowiredprivate RoleDao roleDao;/*** 使用@Cacheable定义缓存策略 当缓存中有值,则返回缓存数据,否则访问方法得到数据 通过value引用缓存管理器,通过key定义键* * @param id*            角色编号* @return 角色*/@Override@Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED)@Cacheable(value = "redisCacheManager", key = "'redis_role_'+#id")public Role getRole(Long id) {return roleDao.getRole(id);}/*** 使用@CachePut则表示无论如何都会执行方法,最后将方法的返回值再保存到缓存中* 使用在插入数据的地方,则表示保存到数据库后,会同期插入到Redis缓存中* * @param role*            角色对象* @return 角色对象(会回填主键)*/@Override@Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED)@CachePut(value = "redisCacheManager", key = "'redis_role_'+#result.id")public Role insertRole(Role role) {roleDao.insertRole(role);return role;}/*** 使用@CachePut,表示更新数据库数据的同时,也会同步更新缓存* * @param role*            角色对象* @return 影响条数*/@Override@Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED)@CachePut(value = "redisCacheManager", key = "'redis_role_'+#role.id")public int updateRole(Role role) {return roleDao.updateRole(role);}/*** 使用@CacheEvict删除缓存对应的key* * @param id*            角色编号* @return 返回删除记录数*/@Override@Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED)@CacheEvict(value = "redisCacheManager", key = "'redis_role_'+#id")public int deleteRole(Long id) {return roleDao.deleteRole(id);}}

Spring Cache-缓存注解(二)相关推荐

  1. Spring Cache缓存技术,Cacheable、CachePut、CacheEvict、Caching、CacheConfig注解的使用

    前置知识: 在Spring Cache缓存中有两大组件CacheManager和Cache.在整个缓存中可以有多个CacheManager,他们负责管理他们里边的Cache.一个CacheManage ...

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

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

  3. Spring Cache常用注解详解

    Spring Cache常用注解详解 @EnableCaching 开启Spring Cache框架支持.解析对应的注解,实现缓存读写访问 @CacheConfig 缓存配置,可以配置当前类型中所用缓 ...

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

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

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

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

  6. Spring Cache 缓存原理与 Redis 实践

    说到Spring Boot缓存,那就不得不提JSR-107规范,它告诉我们在Java中如何规范地使用缓存. JSR是Java Specification Requests的简称,通常译为"J ...

  7. spring cache相关注解介绍 @Cacheable、@CachePut、@CacheEvict

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. @Cacheable是用来声明方法是可缓存的.将结果存储到缓存中以便后续使用相同参数调用时不需执行实 ...

  8. spring cache annotation(二)

    1.@CachePut注解 当缓存需要在不干扰方法执行的情况下被更新,我们使用该注解. 方法总是会被调用,它的结果会替换缓存钟得值(根据 @CachePut的选项). 注解提供了类似@Cacheabl ...

  9. spring cache相关注解介绍 @Cacheable、@CachePut、@CacheEvict

    Cacheable CachePut CacheEvict annotation CacheConfig 开启缓存注解 @Cacheable @Cacheable是用来声明方法是可缓存的.将结果存储到 ...

最新文章

  1. c语言 结构体映射,内存管理之4:页面映射中的结构体
  2. js遍历追加html子样式,前端基本功:JS(十一)动画封装(CSS样式获取、JSON遍历)...
  3. java 小时转换为xx天xx小时
  4. java 发送邮件_SpringBoot 2.1.5发送验证码邮件
  5. 【讨论】测试工程师能否作为一份终生职业?30岁+怎么办?
  6. D-tale功能的探索
  7. 通过2048学习自定义view(一)
  8. 苹果电脑的文件怎么复制到移动硬盘,macbook文件怎么拷贝到移动硬盘
  9. win10系统中“无法使用内置管理员账户打开,请使用其他账户登录再试一次“
  10. 推荐一个多端的开发框架uni-app
  11. 生物信息学|深度学习改善了药物药物相互作用和药物食物相互作用的预测精度
  12. linux创建后门账户,Linux后门
  13. 【Java开发者专场】阿里专家梁笑:2018双十一下单成功率99.9%!供应链服务平台如何迎接大促... 1
  14. Acne Scarring Treatment
  15. 与其他数据库相比,MySQL的特点
  16. java窗体实现随机点名软件,求一个教师随机点名程序
  17. TensorRt(2)快速入门介绍
  18. 张一鸣,究竟有多可怕?身家千亿,不爱豪车美女,就喜欢做产品!
  19. MybatisPlu自动生成CRUD接口(二)
  20. mysql查找会员真实姓名_从mysql数据里边分析某一字段是否为真实姓名的方法

热门文章

  1. 插入排序(含希尔排序)的C/C++实现
  2. OpenMP入门教程(二)reduce sum
  3. C 语言链表其他实现
  4. nio2 java_java NIO2(file io)
  5. 将整型字符串转成整数值
  6. 强化学习(五)---基于模型的强化学习实战
  7. torch_geometric 笔记:global_mean_pool
  8. 深度学习100例 -卷积神经网络(ResNet-50)鸟类识别 | 第8天
  9. QT如何实现对于字符串数学公式计算
  10. numpy.arcsin详解