Spring Cache之本地缓存注解@Cacheable,@CachePut,@CacheEvict使用

简介: SpringCache不支持灵活的缓存时间和集群,适合数据量小的单机服务或对一致性要求不高的场景。`@EnableCaching`启用缓存。`@Cacheable`用于缓存方法返回值,`value`指定缓存名称,`key`定义缓存键,可按SpEL编写,`unless`决定是否不缓存空值。当在类上使用时,类内所有方法都支持缓存。`@CachePut`每次执行方法后都会更新缓存,而`@CacheEvict`用于清除缓存,支持按键清除或全部清除。Spring Cache结合Redis可支持集群环境。

使用前需要在启动类上添加一个注解:@EnableCaching

先说一下SpringCache是不支持灵活的缓存时间设置的,但可以自己实现。且不支持集群,因为不是中间件,是缓存到每台机器上,除非所有机器都有缓存。

所以使用场景一般是数据量较小的单机服务。或者对数据一致性要求不高的场景。

1.@Cacheable介绍

@Cacheable(value = CacheConstants.MENU_DETAILS, key = "#roleId + '_menu'", unless = "#result == null")
@Cacheable(value = CacheConstants.TENANT_CACHE, key = "#tenId + '_cache-tenId'", unless = "#result == null")

value:缓存名称,value属性是必须指定的,其表⽰当前⽅法的返回值是会被缓存在哪个Cache上的,对应Cache的名称。

在方法上加上@Cacheable注解就可以启用缓存了,不需要额外的代码。

key:缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照⽅法的所有参数进⾏组合。一般用查询的参数名+业务描述。用来在对应缓存中找到这条缓存信息。
unless:当⽅法返回空值时,就不会被缓存起来,决定是否要否定⽅法缓存,可以⽤来做条件。

@Cacheable可以标记在⼀个⽅法上,也可以标记在⼀个类上。当标记在⼀个⽅法上时表⽰该⽅法是⽀持缓存的,当标记在⼀个类上时则表⽰该类所有的⽅法都是⽀持缓存的。对于⼀个⽀持缓存的⽅法,Spring会在其被调⽤后将其返回值缓存起来,以保证下次利⽤同样的参数来执⾏该⽅法时可以直接从缓存中获取结果,⽽不需要再次执⾏该⽅法。Spring在缓存⽅法的返回值时是以键值对进⾏缓存的,值就是⽅法的返回结果,也就是cache本身,⾄于键的话,Spring⼜⽀持两种策略,默认策略和⾃定义策略,这个稍后会进⾏说明。需要注意的是当⼀个⽀持缓存的⽅法

在对象内部被调⽤时是不会触发缓存功能的。适用于查询方法。

2.@CachePut

@CachePut也可以声明一个方法支持缓存功能。适用于更新缓存,其实不是更新缓存而是 更新语义的方法,updateXXX。然后需要把更新的对象结果返回。
与 @Cacheable 不同的是使用 @CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。
​使用@CachePut 可以指定的属性跟 @Cacheable 是一样的。执行方法体 - 将结果缓存起来;意义不大

3.@CacheEvict

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

说明:现在spring cache 也可以+redis 实现支持集群环境(需要配置类),但不如直接使用redis

目录
相关文章
|
7月前
|
缓存 监控 Java
SpringBoot @Scheduled 注解详解
使用`@Scheduled`注解实现方法周期性执行,支持固定间隔、延迟或Cron表达式触发,基于Spring Task,适用于日志清理、数据同步等定时任务场景。需启用`@EnableScheduling`,注意线程阻塞与分布式重复问题,推荐结合`@Async`异步处理,提升任务调度效率。
1095 128
|
6月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
675 2
|
7月前
|
XML Java 数据格式
常用SpringBoot注解汇总与用法说明
这些注解的使用和组合是Spring Boot快速开发和微服务实现的基础,通过它们,可以有效地指导Spring容器进行类发现、自动装配、配置、代理和管理等核心功能。开发者应当根据项目实际需求,运用这些注解来优化代码结构和服务逻辑。
486 12
|
7月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
1268 5
|
7月前
|
传感器 Java 数据库
探索Spring Boot的@Conditional注解的上下文配置
Spring Boot 的 `@Conditional` 注解可根据不同条件动态控制 Bean 的加载,提升应用的灵活性与可配置性。本文深入解析其用法与优势,并结合实例展示如何通过自定义条件类实现环境适配的智能配置。
374 0
探索Spring Boot的@Conditional注解的上下文配置
|
存储 缓存 Java
【Spring原理高级进阶】有Redis为啥不用?深入剖析 Spring Cache:缓存的工作原理、缓存注解的使用方法与最佳实践
【Spring原理高级进阶】有Redis为啥不用?深入剖析 Spring Cache:缓存的工作原理、缓存注解的使用方法与最佳实践
|
缓存 Java 数据库
优化您的Spring应用程序:缓存注解的精要指南
优化您的Spring应用程序:缓存注解的精要指南
281 0
|
存储 缓存 Java
Spring缓存注解【@Cacheable、@CachePut、@CacheEvict、@Caching、@CacheConfig】使用及注意事项
Spring缓存注解【@Cacheable、@CachePut、@CacheEvict、@Caching、@CacheConfig】使用及注意事项
4850 2
|
缓存 NoSQL Java
Spring Cache-缓存注解(二)
Spring Cache-缓存注解(二)
352 0
|
存储 缓存 搜索推荐
Spring Cache抽象-缓存注解
Spring Cache抽象-缓存注解
282 0