news 2026/4/29 5:34:37

Spring Cache讲解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spring Cache讲解

目录

  • 一、Spring Cache是什么
    • 1、核心优势
    • 2、基本使用
      • 1. 添加依赖
      • 2. 启用缓存
  • 二、核心注解详解
    • 1、@EnableCaching
    • 2、@Cacheable
    • 3、@CachePut
    • 4、@CacheEvict

一、Spring Cache是什么

Spring CacheSpring框架提供的缓存抽象层,让你可以轻松地在应用程序中添加缓存功能,而无需关心底层缓存实现细节。
Spring Cache 是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。

1、核心优势

特点说明
声明式缓存使用注解即可实现缓存功能
抽象层设计支持多种缓存实现(RedisEhCacheGuava等)
与 Spring 集成完美集成 Spring 生态
方法级缓存基于方法返回值进行缓存
缓存策略灵活支持条件缓存、同步刷新等

2、基本使用

1. 添加依赖

<!-- Spring Boot Starter Cache --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId></dependency><!-- Redis 作为缓存实现 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>

2. 启用缓存

@SpringBootApplication@EnableCaching// 启用缓存支持publicclassApplication{publicstaticvoidmain(String[]args){SpringApplication.run(Application.class,args);}}

二、核心注解详解

1、@EnableCaching

@EnableCachingSpring 框架中的一个注解,用于启用 Spring 的缓存支持。当你在配置类上添加此注解时,Spring 会创建一个缓存相关的切面,以拦截带有缓存注解的方法调用。

主要作用

  • 启用缓存机制:在 Spring 应用中激活缓存功能
  • 自动配置:根据项目依赖自动配置合适的CacheManager
  • 注解驱动:支持使用@Cacheable,@CacheEvict,@CachePut等注解
@Configuration@EnableCachingpublicclassCacheConfig{// Spring Boot 会自动配置合适的 CacheManager// 手动配置示例:@BeanpublicCacheManagercacheManager(){returnnewConcurrentMapCacheManager("users","products");}}

2、@Cacheable

@CacheableSpring 缓存中最核心的注解,用于标记方法的返回结果应该被缓存。
解释:在方法执行前先查询缓存中是否有数据,如果有数据,则直接返回缓存数据;如果没有缓存数据,调用方法并将方法返回值放到缓存中

@GetMapping@Cacheable(value="userCache",key="#id")publicUsergetById(Longid){Useruser=userMapper.getById(id);returnuser;}

@Cacheable(value = "userCache",key = "#id")value的属性是存在redis中的名称,存到redis的时候会创建value::keyredis中。
@Cacheable(value = "userCache",key = "#id")中的key是和value代码作为::后面的参数。
我们查看源码的时候可以看到,如下的情况:
key可以用多种情况展示,参数名称,当有多个参数的时候可以使用#p0,#p1,单一参数的时候可以使用#root,参数名称等多种情况。
数据验证

Debug运行项目,查看项目的执行流程。
使用Swagger进行代码调试:http://localhost:8888/doc.html#/home

当数据没有存到redis时候,会直接查询数据库,如果存到redis之后会直接从redis中查找,并且不经过代码直接返回。
redis没有存储信息:

接口会直接进入到代码当中:

返回结果:

redis中的结果:

现在redis中已经有了key值,我们再执行以下逻辑(根据耗时可以看出直接从redis中获取了):

3、@CachePut

@CachePut注解用于更新缓存,它总是会执行方法体,并将返回结果放入缓存中。与@Cacheable不同的是,无论缓存中是否已存在,都会执行方法并更新缓存。

参数详解

参数说明示例
value/cacheNames缓存名称"users"
key缓存键#user.id,#result.id
keyGenerator键生成器"customKeyGenerator"
cacheManager缓存管理器"redisCacheManager"
cacheResolver缓存解析器"customResolver"
condition执行条件#user != null
unless排除条件#result == null
参数使用方法:
@PostMapping@CachePut(value="userCache",key="#user.id")publicUsersave(@RequestBodyUseruser){userMapper.insert(user);returnuser;}

@CachePut(value = “userCache”,key = “#user.id”),可以根据user参数进行解析出来。
数据验证:
接口方法如下:

接口调试方法如下:

方法进入接口中:

结果如下:

4、@CacheEvict

@CacheEvict用于清除缓存中的数据。当数据发生变化(删除、更新)时,需要清除旧缓存,以保证数据一致性。
参数特征

参数说明默认值示例
value/cacheNames缓存名称-"users"
key要清除的缓存键#id,#user.id
allEntries是否清除所有条目falsetrue
beforeInvocation调用前还是调用后清除falsetrue
condition清除条件#id != null
keyGenerator键生成器"customKeyGenerator"
cacheManager缓存管理器"redisCacheManager"
cacheResolver缓存解析器"customResolver"

接口方法1:

@CacheEvict(value="userCache",key="#id")@DeleteMappingpublicvoiddeleteById(Longid){userMapper.deleteById(id);}

接口方法2:

@CacheEvict(value="userCache",allEntries=true)@DeleteMapping("/delAll")publicvoiddeleteAll(){userMapper.deleteAll();}

,key = "#id"是删除单个keyallEntries=true的时候是删除所有的key
运行结果:

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/27 11:11:04

Miniconda在Ubuntu上的安装与配置全攻略(含清华镜像)

Miniconda在Ubuntu上的安装与配置全攻略&#xff08;含清华镜像&#xff09; 在当今AI和数据科学项目日益复杂的背景下&#xff0c;一个干净、隔离且可复现的开发环境几乎成了标配。你有没有遇到过这样的场景&#xff1a;刚跑通一个项目的代码&#xff0c;换到另一个项目时却因…

作者头像 李华
网站建设 2026/4/23 11:31:40

Java毕设项目:基于SpringBoot公寓服务平台的设计与实现基于springboot公寓管理系统(源码+文档,讲解、调试运行,定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/23 12:10:06

Java毕设项目:基于SpringBoot+Vue非物质文化遗产数字化传承的设计与实现基于springboot非物质文化遗产数字化传承(源码+文档,讲解、调试运行,定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/28 16:41:47

gpt-oss-20b是否支持函数调用?测试其工具使用能力

gpt-oss-20b是否支持函数调用&#xff1f;测试其工具使用能力 在AI代理&#xff08;Agent&#xff09;和自动化系统日益普及的今天&#xff0c;一个大模型能否“采取行动”往往比“回答问题”更重要。真正智能的助手不应止步于文本生成——它应该能查天气、发邮件、操作数据库&…

作者头像 李华
网站建设 2026/4/28 19:26:09

冒泡排序、选择排序与字典及 var、dynamic 区别总结

本文介绍了冒泡排序和选择排序的核心逻辑与实现&#xff0c;以及C#中Dictionary字典的使用方法。冒泡排序通过相邻元素比较交换将最大值&quot;冒泡&quot;到末尾&#xff0c;选择排序则通过选择最值元素与未排序区间首元素交换。Dictionary字典通过键值对存储数据&#…

作者头像 李华