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

本文主要是介绍【日积月累】SpringBoot 通过注解@CacheConfig @Cacheable @CacheEvict @CachePut @Caching使用缓存,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 1.前言
  • 2.引入依赖
  • 3.启动类加入注解@EnableCaching
  • 4.常用注解
    • 4.1@CacheConfig
    • 4.2@Cacheable
    • 4.3@CacheEvict
    • 4.4@CachePut
    • 4.5@Caching
  • 5.总结
  • 6.参考


文章所属专区 日积月累


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 {@Cacheablepublic 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运行流程-笔记

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

这篇关于【日积月累】SpringBoot 通过注解@CacheConfig @Cacheable @CacheEvict @CachePut @Caching使用缓存的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/364483

相关文章

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

Java内存分配与JVM参数详解(推荐)

《Java内存分配与JVM参数详解(推荐)》本文详解JVM内存结构与参数调整,涵盖堆分代、元空间、GC选择及优化策略,帮助开发者提升性能、避免内存泄漏,本文给大家介绍Java内存分配与JVM参数详解,... 目录引言JVM内存结构JVM参数概述堆内存分配年轻代与老年代调整堆内存大小调整年轻代与老年代比例元空

深度解析Java DTO(最新推荐)

《深度解析JavaDTO(最新推荐)》DTO(DataTransferObject)是一种用于在不同层(如Controller层、Service层)之间传输数据的对象设计模式,其核心目的是封装数据,... 目录一、什么是DTO?DTO的核心特点:二、为什么需要DTO?(对比Entity)三、实际应用场景解析

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四

SpringBoot整合liteflow的详细过程

《SpringBoot整合liteflow的详细过程》:本文主要介绍SpringBoot整合liteflow的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋...  liteflow 是什么? 能做什么?总之一句话:能帮你规范写代码逻辑 ,编排并解耦业务逻辑,代码