【日积月累】SpringBoot 通过注解@CacheConfig @Cacheable @CacheEvict @CachePut @Caching使用缓存

目录


文章所属专区 日积月累


1.前言

Spring在3.1版本,就提供了一条基于注解的缓存策略,实际使用起来还是很丝滑的,本文将针对几个常用的注解进行简单的介绍说明,有需要的小伙伴可以尝试一下

2.引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
    <version>2.1.3.RELEASE</version>
</dependency>

3.启动类加入注解@EnableCaching

@EnableCaching
public class demoWebApplication {
    public static void main(String[] args) {
        RestCrossDomainProvider.restCustomProvider();
        SpringApplication.run(GeneralWebApplication.class, args);
    }
}

4.常用注解

@CacheConfig @Cacheable @CacheEvict @CachePut @Caching

4.1@CacheConfig

@CacheConfig注解用于在类级别上配置缓存的公共属性,避免在每个缓存方法上重复配置相同的缓存属性。通过使用@CacheConfig注解,可以统一指定缓存的名称、键生成器等属性。

属性:
cacheNames :指定缓存的名称
keyGenerator :指定键生成器
tips:在Spring框架中,缓存键生成器(KeyGenerator)负责为缓存中的每个数据项生成唯一的键,用于在检索时查找数据项。默认情况下,Spring使用SimpleKeyGenerator作为缓存键生成器,它使用方法的参数作为键

@CacheConfig(cacheNames = "userCache", keyGenerator = "customKeyGenerator")
public class UserService {
    
    @Cacheable
    public User getUserById(Long userId) {
        // 从数据库中获取用户信息
        return userRepository.findById(userId);
    }
    
    @CachePut(key = "#user.id")
    public User updateUser(User user) {
        // 更新用户信息到数据库
        return userRepository.save(user);
    }
}

4.2@Cacheable

注解用于标记一个方法或类支持缓存。当该方法被调用时,Spring会先检查缓存中是否存在相应的结果,如果存在,则直接返回缓存中的结果,而不执行方法体。如果缓存中不存在结果,则执行方法体,并将结果存入缓存中供下次使用

常用于查询单条,多条数据

属性:
value:指定缓存的名称或缓存管理器的名称。可以使用cacheNames作为value的别名。如果指定了多个名称,将会使用多个缓存进行缓存操作。
key:指定缓存的键。默认情况下,Spring会根据方法的参数生成缓存键。可以使用SpEL表达式来自定义缓存键的生成方式。例如,key = "#param"表示使用方法的参数param作为缓存键。

condition:指定一个SpEL表达式,用于判断是否执行缓存操作。只有当表达式的结果为true时,才会执行缓存操作。

unless:指定一个SpEL表达式,用于判断是否不执行缓存操作。只有当表达式的结果为false时,才会执行缓存操作。与condition相反。

sync:指定是否使用同步模式进行缓存操作。默认值为false,表示使用异步模式。在异步模式下,如果多个线程同时访问同一个缓存项,可能会导致缓存穿透的问题。可以将sync设置为true来避免这个问题。

cacheManager:指定使用的缓存管理器的名称。可以通过该属性指定使用不同的缓存管理器。

cacheResolver:指定使用的缓存解析器的名称。可以通过该属性指定使用不同的缓存解析器。

keyGenerator:指定使用的缓存键生成器的名称。可以通过该属性指定使用不同的缓存键生成器。

@Cacheable(cacheNames = "blacklists", key="'listBlacklist'+'+#currentPageNum+'-'+#countPerPage+'-'+#sortField+'-'+#sortOrder+'-'+#condition",sync = true)

4.3@CacheEvict

@CacheEvict是Spring框架中的一个注解,用于从缓存中移除数据。当使用@CacheEvict注解标记一个方法时,该方法执行后会触发缓存的清除操作

常用与增删改查 旨在保证缓存的一致性和准确性

@CacheEvict(cacheNames = "theme", allEntries = true)

属性:
value:指定要清除的缓存名称或缓存管理器的名称。可以使用cacheNames作为value的别名。如果指定了多个名称,将会清除多个缓存。

key:指定要清除的缓存键。默认情况下,Spring会根据方法的参数生成缓存键。可以使用SpEL表达式来自定义缓存键的生成方式。例如,key = "#param"表示使用方法的参数param作为缓存键。

condition:指定一个SpEL表达式,用于判断是否执行缓存清除操作。只有当表达式的结果为true时,才会执行缓存清除操作。

allEntries:指定是否清除所有缓存项。默认值为false,表示只清除指定缓存键对应的缓存项。如果将allEntries设置为true,则会清除指定缓存名称或缓存管理器下的所有缓存项。

beforeInvocation:指定是否在方法执行之前清除缓存。默认值为false,表示在方法执行之后清除缓存。如果将beforeInvocation设置为true,则会在方法执行之前清除缓存,即使方法执行出现异常。

4.4@CachePut

@CachePut是Spring框架中的一个注解,用于将方法的返回值存储到缓存中。与@Cacheable注解不同的是,@CachePut注解每次都会触发方法的执行,并将结果存储到缓存中。

@CachePut(cacheNames="appTenants", key="'areaCode")

4.5@Caching

@Caching是Spring框架中的一个注解,它允许我们在一个方法或类上同时指定多个Spring缓存相关的注解。通过使用@Caching注解,我们可以灵活地定义缓存策略。

@Caching(
    cacheable = {
        @Cacheable(value = "userCache", key = "#id")
    },
    put = {
        @CachePut(value = "userCache", key = "#result.id")
    },
    evict = {
        @CacheEvict(value = "userListCache", allEntries = true)
    }
)
public User getUserById(Long id) {
    // 从数据库中获取用户信息的逻辑
    return user;
}

在上面的示例中,通过使用@Caching注解,我们同时指定了@Cacheable、@CachePut和@CacheEvict注解。当调用getUserById方法时,会先从名为"userCache"的缓存中查找对应的用户信息,如果缓存中不存在,则执行方法的逻辑,并将返回的用户信息存储到"userCache"缓存中,并且将"userListCache"缓存中的所有数据移除。

5.总结

@CacheConfig:常用于类级别的注解,用于统一配置类缓存的公共属性
@Caching:可以在一个类或方法同时使用多个缓存相关注解,灵活配置缓存策略
@Cacheable:用于标记一个类或方法,当被标记对象被访问,会先去缓存中查询相应的结果,如果存在则返回,不存在则指向方法
@CacheEvict :用于从缓存中移除数据。当使用@CacheEvict注解标记一个方法时,该方法执行后会触发缓存的清除操作
@CachePut :用于将方法的返回值存储到缓存中。与@Cacheable注解不同的是,@CachePut注解每次都会触发方法的执行,并将结果存储到缓存中

6.参考

Spring cache原理详解
什么是缓存雪崩、缓存击穿、缓存穿透?
springboot2.4.0缓存的工作原理与@Cacheable运行流程-笔记

给个三连吧 谢谢谢谢谢谢了
在这里插入图片描述

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
@CacheConfig 和 @Cacheable 都是 Spring 框架中用于缓存注解,它们之间的关系是:@Cacheable 注解可以继承 @CacheConfig 注解中的缓存配置信息。 具体来说,@CacheConfig 注解可以应用在类上,用于指定默认的缓存配置信息,包括缓存的名称、缓存的键前缀、缓存的过期时间等。而 @Cacheable 注解可以应用在方法上,用于指定方法的缓存配置信息,包括缓存的名称、缓存的键、缓存的条件等。如果 @Cacheable 注解没有指定缓存的名称、缓存的键等配置信息,则会默认继承 @CacheConfig 注解中的缓存配置信息。 举个例子,假设有一个类 UserCache,其中定义了一个缓存 userCache,用于缓存用户信息。可以通过 @CacheConfig 注解指定 userCache 缓存的默认配置信息,例如: ```java @CacheConfig(cacheNames = "userCache", keyPrefix = "user_", sync = true) public class UserCache { // ... } ``` 上述代码中,@CacheConfig 注解指定了 userCache 缓存的名称为 userCache,键前缀为 user_,并且使用异步模式缓存数据。 然后,在 UserCache 类的方法中,可以使用 @Cacheable 注解指定方法的缓存配置信息,例如: ```java @Cacheable(key = "#id", condition = "#id>0") public User getUserById(int id) { // ... } ``` 上述代码中,@Cacheable 注解指定缓存的键为方法参数 id,缓存的条件为 id > 0。由于 @CacheConfig 注解指定了缓存的默认配置信息,因此 @Cacheable 注解会默认继承这些配置信息,包括缓存的名称、缓存的键前缀、缓存的过期时间等。 综上所述,@CacheConfig 注解用于指定类级别的缓存配置信息,@Cacheable 注解用于指定方法级别的缓存配置信息,并且 @Cacheable 注解可以继承 @CacheConfig 注解中的缓存配置信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

顶子哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值