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

目录


文章所属专区 日积月累


1.前言

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

2.引入依赖

bash 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
    <version>2.1.3.RELEASE</version>
</dependency>

3.启动类加入注解@EnableCaching

java 复制代码
@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作为缓存键生成器,它使用方法的参数作为键

java 复制代码
@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:指定使用的缓存键生成器的名称。可以通过该属性指定使用不同的缓存键生成器。

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

4.3@CacheEvict

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

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

java 复制代码
@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注解每次都会触发方法的执行,并将结果存储到缓存中。

java 复制代码
@CachePut(cacheNames="appTenants", key="'areaCode")

4.5@Caching

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

java 复制代码
@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运行流程-笔记

给个三连吧 谢谢谢谢谢谢了

相关推荐
Y***h18718 分钟前
第二章 Spring中的Bean
java·后端·spring
8***293130 分钟前
解决 Tomcat 跨域问题 - Tomcat 配置静态文件和 Java Web 服务(Spring MVC Springboot)同时允许跨域
java·前端·spring
CoderYanger34 分钟前
优选算法-栈:67.基本计算器Ⅱ
java·开发语言·算法·leetcode·职场和发展·1024程序员节
q***06291 小时前
Tomcat的升级
java·tomcat
多多*1 小时前
Java复习 操作系统原理 计算机网络相关 2025年11月23日
java·开发语言·网络·算法·spring·microsoft·maven
青云交1 小时前
Java 大视界 -- Java 大数据在智能物流无人配送车路径规划与协同调度中的应用
java·spark·路径规划·大数据分析·智能物流·无人配送车·协同调度
t***p9351 小时前
idea创建SpringBoot自动创建Lombok无效果(解决)
spring boot·后端·intellij-idea
d***81721 小时前
解决SpringBoot项目启动错误:找不到或无法加载主类
java·spring boot·后端
ᐇ9591 小时前
Java集合框架深度实战:构建智能教育管理与娱乐系统
java·开发语言·娱乐
K***72842 小时前
开源模型应用落地-工具使用篇-Spring AI-Function Call(八)
人工智能·spring·开源