spring关于缓存的注解使用@CacheConfig,@Cacheable,@CachePut,@CacheEvict,@Caching

本文详细介绍了SpringBoot项目中使用Redis缓存的四个核心注解:@CacheConfig、@Cacheable、@CachePut和@CacheEvict。@CacheConfig用于设置类级别的缓存配置,如缓存名称、缓存管理器和KeyGenerator。@Cacheable标记方法结果可缓存,@CachePut确保每次调用都更新缓存,而@CacheEvict则用于清除缓存。此外,@Caching用于组合多个缓存操作。每个注解的属性和用法都有清晰的示例说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

总述

目前的spring boot项目使用到了redis缓存,再次记录一下关于缓存的注解
主要用到的是这四个

import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.Caching;
import org.springframework.cache.annotation.CachePut;

@CacheConfig,@Cacheable,@CachePut,@CacheEvict,@Caching

@CacheConfig

提供一种在类级别共享公共缓存相关设置的机制。

{@code @CacheConfig} 
provides a mechanism for sharing common cache-related settings at the class level.

这个注解写在类上,主要作用是抽取缓存方法的公共属性

主要属性有:

  • 缓存名称:cacheNames,对应value或者cacheNames
  • 缓存管理器名称:cacheManager,对应cacheManager
  • KeyGenerator的名称集合:keyGenerator,对应keyGenerator

示例如下

@CacheConfig(cacheNames = CachingConfig.CacheName.CACHE_NAME,
		cacheManager = CachingConfig.CacheManagerName.REDIS_CACHE_MANAGER,
		keyGenerator = CachingConfig.KeyGeneratorNames.CONFIG_KEY_GENERATOR)
@Component
@Slf4j
public class RedisAccessCacheImpl implements RemoteAccessCache {
}

@Cacheable

放置在方法上,表示可以将结果放入缓存

Annotation indicating that the result of invoking a method 
(or all methods  in a class) can be cached.

主要属性有:

  • 键名:key,可以为空,可使用 SpEL 表达式编写,如果为空,则按照方法的所有参数进行组合
  • 缓存条件:condition,可以为空,使用 SpEL 编写,返回 true 或 false,为 true 才进行缓存
  • 缓存名称:value,可集体抽取为@CacheConfig的cacheNames,或者单独写,必填

示例如下

@Cacheable(key = "'getObsToken_'+ #name")
public TokenVO getToken(String name) {
	return getObsToken.getToken(name);
}

@CachePut

与@Cacheable基本相同
区别是

  • @CachePut:这个注释可以确保方法被执行,同时方法的返回值也被记录到缓存中。
  • @Cacheable:当重复使用相同参数调用方法时,方法本身不会被调用,而是直接从缓存中找到结果并返回。
  • 也就是说@Cacheable一次缓存,不再更新。@CachePut次次缓存,一直更新

@CacheEvict

放置在方法上,可以按照条件清除缓存

Annotation indicating that a method (or all methods on a class) triggers a 
{@link org.springframework.cache.Cache#evict(Object) cache evict} operation

主要属性有:

  • 键名:key,可以为空,可使用 SpEL 表达式编写,如果为空,则按照方法的所有参数进行组合
  • 缓存条件:condition,可以为空,使用 SpEL 编写,返回 true 或 false,为 true 才进行缓存
  • 缓存名称:value,可集体抽取为@CacheConfig的cacheNames,或者单独写,必填
  • 是否清空所有缓存:allEntries,缺省为 false,指定为 true
  • 是否在方法执行前就清空:beforeInvocation,缺省为 false,指定为 true

示例如下

	@CacheEvict(key = "'findByBatchId_'+ #detailId + '_' + #batchId ")
	public void updateByBatchId(Long detailId, String batchId) {
		batchHistoryRepository.updateByBatchId(detailId,batchId);
	}

@Caching

为自定义的组合缓存规则

Group annotation for multiple cache annotations (of different or the same type).

主要属性有:

  • @Cacheable的组合:cacheable,默认{}
  • @CachePut的组合:put,默认{}
  • @CacheEvict的组合:evict,默认{}

示例如下

	@Caching(evict = { 
		@CacheEvict(key = "'findByDocInfo_'+ #docVO.bussNo + '_'+ #docVO.category"),
		@CacheEvict(key = "'selectByDocDetailId_'+ #docVO.id"),
		@CacheEvict(key = "'findByDocDetailId_'+ #docVO.id ")
		})
    public void updateFileSort(DocVO docVO, DocDetailVO detailVO) {
        impDocFileRepository.updateFileSort(detailVO.getId(),detailVO.getSort());
    }
### MyBatis-Plus 中声明式缓存注解使用方法及属性说明 #### 一、`@EnableCaching` 该注解用于开启 Spring缓存功能,通常放在配置类或启动类上。启用后,Spring 将会扫描项目中的其他缓存相关注解并生效。 ```java @SpringBootApplication @EnableCaching public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` --- #### 二、`@Cacheable` 此注解适用于查询操作场景,表示如果缓存中有数据则直接返回缓存内容;如果没有,则执行目标方法并将结果放入缓存中[^2]。 ##### 属性说明: | 属性名 | 描述 | |--------------|----------------------------------------------------------------------------------------| | `value` | 缓存名称(必填),指定要使用缓存区域 | | `key` | 定义缓存键,默认基于方法参数生成 | | `condition` | 条件表达式,满足条件时才进行缓存 | | `unless` | 反向条件表达式,当条件为真时不保存到缓存 | 示例代码: ```java @Service public class UserService { @Cacheable(value = "users", key = "#id") public User getUserById(Long id) { System.out.println("从数据库获取用户:" + id); return new User(id, "User" + id); // 模拟数据库查询逻辑 } } ``` --- #### 三、`@CachePut` 此注解用于更新缓存的操作场景,无论缓存是否存在都会执行目标方法,并将结果写入缓存中[^2]。 ##### 属性说明: | 属性名 | 描述 | |--------------|----------------------------------------------------------------------------------------| | `value` | 缓存名称 | | `key` | 定义缓存键 | | `condition` | 执行前判断条件 | 示例代码: ```java @Service public class UserService { @CachePut(value = "users", key = "#user.id") public User updateUser(User user) { System.out.println("更新用户信息:" + user.getId()); return user; // 更新后的对象会被重新加入缓存 } } ``` --- #### 四、`@CacheEvict` 此注解用于清除缓存的操作场景,在方法执行前后可以触发缓存清理动作。 ##### 属性说明: | 属性名 | 描述 | |--------------|----------------------------------------------------------------------------------------| | `value` | 缓存名称 | | `key` | 定义缓存键 | | `allEntries` | 是否清空整个缓存区域 | | `beforeInvocation` | 是否在方法执行前清除缓存 | 示例代码: ```java @Service public class UserService { @CacheEvict(value = "users", key = "#id") public void deleteUser(Long id) { System.out.println("删除用户:" + id); } @CacheEvict(value = "users", allEntries = true) public void clearAllUsers() { System.out.println("清空所有用户缓存"); } } ``` --- #### 五、`@Caching` 这是一个组合型注解,允许在一个方法上同时定义多个缓存行为,例如读取、更新和清除缓存[^1]。 ##### 属性说明: | 属性名 | 描述 | |--------------|----------------------------------------------------------------------------------------| | `cacheable` | 配置一组`@Cacheable`注解 | | `put` | 配置一组`@CachePut`注解 | | `evict` | 配置一组`@CacheEvict`注解 | 示例代码: ```java @Service public class UserService { @Caching( cacheable = {@Cacheable(value = "users", key = "#id")}, put = {@CachePut(value = "recentlyAccessedUsers", key = "#result.id")} ) public User findUserWithCaching(Long id) { System.out.println("查找用户:" + id); return new User(id, "User" + id); } } ``` --- #### 六、`@CacheConfig` 此注解用于简化重复性的缓存配置,可应用于类级别设置默认的缓存名称或其他公共属性。 ##### 属性说明: | 属性名 | 描述 | |--------------|----------------------------------------------------------------------------------------| | `cacheNames` | 默认缓存名称 | 示例代码: ```java @Service @CacheConfig(cacheNames = "users") public class UserService { @Cacheable(key = "#id") public User getUserById(Long id) { return new User(id, "User" + id); } @CachePut(key = "#user.id") public User updateUser(User user) { return user; } @CacheEvict(key = "#id") public void deleteUser(Long id) {} } ``` --- ### 总结 以上介绍了 MyBatis-Plus 和 Spring Cache 结合使用的常见注解及其属性的作用。通过这些注解,开发者能够灵活地实现各种缓存策略,从而提升应用性能。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值