@Cacheable、@CachePut、@CacheEvict、@Caching、@CacheConfig详解

2023-11-17

一、概述

本文主要是为了个人练习spring的缓存注解【@Cacheable、@CachePut、@CacheEvict、@Caching、@CacheConfig】,以及总结个人在使用过程中发现的疑惑点,以及如何解决等思路,另外该文章不会写的特别繁琐、复杂,如果具体想查看某个注解的详细使用方式请单个注解去CSDN查询即可,我这边只是为了个人总结,言简意赅那种。

二、缓存注解种类

  1. @EnableCaching
  2. @Cacheable
  3. @CachePut
  4. @CacheEvict
  5. @Caching
  6. @CacheConfig

@Cacheable:主要用于 “查询” 功能
@CachePut:主要用于 “修改” 功能
@CacheEvict:主要用于 “删除” 功能

三、优劣势说明

优点:spring本地缓存注解使用起来很方便,配置也很简单,上手容易。

缺点:使用场景有局限,不能用于分布式环境,因为注解缓存实际是缓存服务器本地内存中的,如果项目是集群部署,那么就需要本地缓存3份一模一样的,实际真犯不上这样干,费时费力费资源。即:单机环境推荐使用本地缓存注解,集群环境建议使用redis等缓存技术。

四、如何使用?

  1. 第1步:在启动类上加注解@EnableCaching
  2. 第2步:在具体方法上加注解【@CachePut、@CacheEvict、@Caching】

五、详细介绍介绍

1)@Cacheable(常用)

在 @Cacheable 注解的使用中,共有 9 个属性供我们来使用,这 9 个属性分别是: value、 cacheNames、 key、 keyGenerator、 cacheManager、 cacheResolver、 condition、 unless、 sync。接下来我们就分别来介绍一下它的使用。

1.value/cacheNames 属性

如下图所示,这两个属性代表的意义相同,根据@AliasFor注解就能看出来了。这两个属性都是用来指定缓存组件的名称,即将方法的返回结果放在哪个缓存中,属性定义为数组,可以指定多个缓存;
在这里插入图片描述

//这两种配置等价
@Cacheable(value = "user") //@Cacheable(cacheNames = "user")
User getUser(Integer id);

2.key属性

可以通过 key 属性来指定缓存数据所使用的的 key,默认使用的是方法调用传过来的参数作为 key。最终缓存中存储的内容格式为:Entry<key,value> 形式。

  1. 如果请求没有参数:key=new SimpleKey();
  2. 如果请求有一个参数:key=参数的值
  3. 如果请求有多个参数:key=newSimpleKey(params); (你只要知道 key不会为空就行了)

key值的编写,可以使用 SpEL 表达式的方式来编写;除此之外,我们同样可以使用 keyGenerator
生成器的方式来指定 key,我们只需要编写一个 keyGenerator ,将该生成器注册到 IOC 容器即可。(keyGenerator的使用,继续往下看)

在这里插入图片描述
使用示例如下:

@Cacheable(value = "user",key = "#root.method.name")
User getUser(Integer id);

3.keyGenerator 属性

key 的生成器。如果觉得通过参数的方式来指定比较麻烦,我们可以自己指定 key 的生成器的组件 id。key/keyGenerator属性:二选一使用。我们可以通过自定义配置类方式,将 keyGenerator 注册到 IOC 容器来使用。

import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.lang.reflect.Method;
import java.util.Arrays;

@Configuration
public class MyCacheConfig {

    @Bean("myKeyGenerator")
    public KeyGenerator keyGenerator(){
        return new KeyGenerator(){

            @Override
            public Object generate(Object target, Method method, Object... params) {
                return method.getName()+ Arrays.asList(params).toString();
            }
        };
    }

    /**
     * 支持 lambda 表达式编写
     */
    /*@Bean("myKeyGenerator")
    public KeyGenerator keyGenerator(){
        return ( target,  method, params)-> method.getName()+ Arrays.asList(params).toString();
    }*/
}

4.cacheManager 属性

该属性,用来指定缓存管理器。针对不同的缓存技术,需要实现不同的 cacheManager,Spring 也为我们定义了如下的一些 cacheManger 实现()
在这里插入图片描述

5.cacheResolver 属性

该属性,用来指定缓存解析器。使用配置同 cacheManager 类似,可自行百度。(cacheManager指定管理器/cacheResolver指定解析器 它俩也是二选一使用)

6.condition 属性

条件判断属性,用来指定符合指定的条件下才可以缓存。也可以通过 SpEL 表达式进行设置。这个配置规则和上面表格中的配置规则是相同的。

@Cacheable(value = "user",condition = "#id>0")//传入的 id 参数值>0才进行缓存
User getUser(Integer id);
@Cacheable(value = "user",condition = "#a0>1")//传入的第一个参数的值>1的时候才进行缓存
User getUser(Integer id);
@Cacheable(value = "user",condition = "#a0>1 and #root.methodName eq 'getUser'")//传入的第一个参数的值>1 且 方法名为 getUser 的时候才进行缓存
User getUser(Integer id);

7.unless 属性

unless属性,意为"除非"的意思。即只有 unless 指定的条件为 true 时,方法的返回值才不会被缓存。可以在获取到结果后进行判断。

@Cacheable(value = "user",unless = "#result == null")//当方法返回值为 null 时,就不缓存
User getUser(Integer id);
@Cacheable(value = "user",unless = "#a0 == 1")//如果第一个参数的值是1,结果不缓存
User getUser(Integer id);

8.sync 属性

该属性用来指定是否使用异步模式,该属性默认值为 false,默认为同步模式。异步模式指定 sync = true 即可,异步模式下 unless 属性不可用。

2)@CachePut(常用)

@CachePut 也可以声明一个方法支持缓存功能。
与 @Cacheable 不同的是使用 @CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。
​使用@CachePut 可以指定的属性跟 @Cacheable 是一样的, @CachePut 适用于缓存更新。

3)@CacheEvict(常用)

@CacheEvict 是用来标注在需要清除缓存元素的方法或类上的。当标记在一个类上时表示其中所有的方法的执行都会触发缓存的清除操作。
@CacheEvict支持的属性额外增加了两个:
​ 1、allEntries:是否需要清除缓存中的所有元素。默认为 false ,表示不需要。当指定了 allEntries 为 true 时,Spring Cache将忽略指定的key,删除缓存中所有键;
​ 2、beforeInvocation: 是否在方法执行成功之后触发键删除操作,默认是在对应方法成功执行之后触发的,若此时方法抛出异常而未能成功返回,不会触发清除操作。指定该属性值为 true 时,Spring会在调用该方法之前清除缓存中的指定元素。

4)@Caching(不常用)

@Caching 注解可以在一个方法或者类上同时指定多个Spring Cache相关的注解。
其拥有三个属性:cacheable、put 和 evict,分别用于指定@Cacheable、@CachePut 和 @CacheEvict。对于一个数据变动,更新多个缓存的场景,可以通过 @Caching 来实现:

@Caching(cacheable = @Cacheable(cacheNames = "caching", key = "#age"), evict = @CacheEvict(cacheNames = "t4", key = "#age"))
public String caching(int age) {
    return "caching: " + age + "-->" + UUID.randomUUID().toString();
}

上面这个就是组合操作:从 caching::#age 缓存取数据,不存在时执行方法并写入缓存;删除缓存 t4::#age。

5)@CacheConfig(不常用)

如果一个类中,多个方法都有同样的 cacheName,keyGenerator,cacheManager 和 cacheResolver,可以直接使用 @CacheConfig 注解在类上声明,这个类中的方法都会使用@CacheConfig 属性设置的相关配置。

@Component
@CacheConfig(cacheNames = "mall_cache")
public class CacheComponent {

	
    @Cacheable(key = "'perm-whitelist-'+#clientId", unless="#result == null")
    public List<String> cacheWriteList(String clientId){
    	...
    }
       
     @Cacheable(key = "'perm-cutom-aci-' + #tenantId + '-' + #roleId + '-' + #tenantLevel + '-' + #subType", unless="#result == null")
    public List<RequestDto> cacheRequest(Long tenantId,Long roleId,Integer tenantLevel,Integer subType){
        ...
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

@Cacheable、@CachePut、@CacheEvict、@Caching、@CacheConfig详解 的相关文章

随机推荐

  • 浅谈矩阵分解在推荐系统中的应用

    推荐系统是当下越来越热的一个研究问题 无论在学术界还是在工业界都有很多优秀的人才参与其中 近几年举办的推荐系统比赛更是一次又一次地把推荐系统的研究推向了高潮 比如几年前的Neflix百万大奖赛 KDD CUP 2011的音乐推荐比赛 去年的
  • LeetCode 27. Remove Element(删除元素)

    原题网址 https leetcode com problems remove element Given an array and a value remove all instances of that value in place a
  • spring quartz 1.6配置方法

    该配置文件针对quartz 1 6 0 jar 较为常见 配置文件如下 启动时引入加载即可
  • 查看java编程环境是否配置成功

    验证Java编程环境是否配置成功 点击键盘Windows r键 打开运行提示框输入cmd按回车键打开命令框 输入javac 点击回车 查看java编译环境是否正常 输入 java 点击回车 查看java运行环境是否正常 输入java ver
  • 一起聊聊等保测评

    现在好多企业里面好像都在搞这个等保测评 这个等保测评终究是个什么东西呢 那企业为什么要做这个等保测评呢 做完之后对企业又有什么帮助呢 然后就是哪些企业需要做等保测呢 甚至很多企业做了很多次等保测评最后都不太了解这个等保测评 那今天就让我们一
  • QFramelessWidget 中多个组件添加滚动条

    QFramelessWidget 无边框窗口 QFramelessWidget是一个无框架的窗口小部件 它提供了一种在主窗口外绘制自定义窗口小部件的方法 在QFramelessWidget中添加多个组件时 有时候需要在这些组件中添加滚动条
  • echarts仪表盘进度条、指针动态渐变色显示

    1 echarts仪表盘实现效果如下 2 配置项代码 const option 鼠标悬浮的提示 tooltip formatter b c series type gauge min 0 最大值 max 100 最小值 startAngle
  • shiro简介以及基本框架搭建

    Shiro框架是一个基于java实现认证登录的安全框架 它是由Apache推出的 目前最新的版本是1 3 2版本 Shiro主要的功能有 Authentication 身份认证 登录 Authorization 授权 Session Man
  • ftp虚拟服务器登录,ftp虚拟服务器登录

    ftp虚拟服务器登录 内容精选 换一换 默认部署在VPC下的应用可以调用API 如果域名解析失败 则参考配置内网DNS 在当前终端节点上配置DNS服务器 配置完成后 部署在VPC下的应用可以调用API 配置DNS需要配置 etc 目录下的r
  • c++---优先队列(priority_queue)

    C 中的优先队列是STL中的派生容器 它仅考虑最高优先级元素 队列遵循FIFO策略 而优先队列根据优先级弹出元素 即 优先级最高的元素首先弹出 与普通队列区别 在优先队列中 队列中的每个元素都与某个优先级相关联 但是优先级在队列数据结构中不
  • postman做接口测试时一些实用的操作

    Postman 之前是作为Chrome 的一个插件 现在要下载应用才能使用 以下是postman 的界面 各个功能区的使用如下 快捷区 快捷区提供常用的操作入口 包括运行收藏夹的一组测试数据 导入别人共享的收藏夹测试数据 Import fr
  • flutter1.12版本android适配

    1 修改MainActivity public class MainActivity extends io flutter embedding android FlutterActivity 如果与flutter有通信 则覆盖下面方法 pr
  • Makefile的$@、$%、$?、$^ 、$+、$*自动化变量说明

    自动变量 含义 表示规则中的目标文件集 在模式规则中 如果有多个目标 那么 就是匹配于目标中模式定义的集合 仅当目标是函数库文件时 表示规则中的目标成员名 例如 如果一个目标是 foo a bar o 那么 就是 bar o 就是 foo
  • 项目五:智慧家庭

    目录 1 项目功能演示 2 总体框架 3 WIFI连接模块 4 智能门禁模块 5 数据采集模块 6 智能检测模块
  • Caffe源码(十一):io.cpp 分析

    目录 目录 简单介绍 主要函数 ReadProtoFromTextFile 函数 WriteProtoToTextFile 函数 ReadProtoFromBinaryFile 函数 WriteProtoToBinaryFile 函数 Re
  • 关于传递list类型的参数的问题

    java中除了基础的数据类型是值传递外 其它类型都是对象 也就是引用类型 地址传递 这个就不多说了 今天遇到一个问题 就是在多次添加同一个list对象到另一个list里的时候 为什么会添加多少次list对象 外面这层list的大小就有多少呢
  • vim 基础操作

    bash或cmd 已经配置好vim的环境变量 下 vim a txt 创建a txt文件 vim 下 i a o O s进入插入 编辑 模式 esc 退出插入模式 回到正常模式 正常模式下 x 或 wq 保存退出vim 称为底行模式 在正常
  • java项目部署到阿里云服务器步骤

    阿里云服务器详细步骤 一 什么是云服务器ECS 是阿里云产品体系中 最基础的计算服务 通常用作应用程序的运行环境 最重要的特点是弹性 二 基础运行环境 用户的应用程序运行在实例的操作系统上 三 特点 弹性 容量不够可以直接在云服务器上扩展配
  • vue3 中如何动态加载本地图片资源

    在untils文件中加入getImageUrl方法 export const getImageUrl name string type string png gt return new URL 本地资源路径 src assets image
  • @Cacheable、@CachePut、@CacheEvict、@Caching、@CacheConfig详解

    文章目录 一 概述 二 缓存注解种类 三 优劣势说明 四 如何使用 五 详细介绍介绍 1 Cacheable 常用 1 value cacheNames 属性 2 key属性 3 keyGenerator 属性 4 cacheManager