Spring Cache讲解

目录

一、Spring Cache是什么

Spring Cache 是 Spring 框架提供的缓存抽象层,让你可以轻松地 在应用程序中添加缓存功能 ,而无需关心底层缓存实现细节。

Spring Cache 是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。

1、核心优势

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

2、基本使用

1. 添加依赖

xml 复制代码
<!-- 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. 启用缓存

java 复制代码
@SpringBootApplication
@EnableCaching  // 启用缓存支持
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

二、核心注解详解

1、@EnableCaching

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

主要作用

  • 启用缓存机制:在 Spring 应用中激活缓存功能
  • 自动配置 :根据项目依赖自动配置合适的 CacheManager
  • 注解驱动 :支持使用 @Cacheable, @CacheEvict, @CachePut 等注解
java 复制代码
@Configuration
@EnableCaching
public class CacheConfig {
    
    // Spring Boot 会自动配置合适的 CacheManager
    // 手动配置示例:
    @Bean
    public CacheManager cacheManager() {
        return new ConcurrentMapCacheManager("users", "products");
    }
}

2、@Cacheable

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

java 复制代码
    @GetMapping
    @Cacheable(value = "userCache",key = "#id")
    public User getById(Long id){
        User user = userMapper.getById(id);
        return user;
    }

@Cacheable(value = "userCache",key = "#id")中value的属性是存在redis中的名称,存到redis的时候会创建value::的key在redis中。
@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
参数使用方法:
java 复制代码
    @PostMapping
    @CachePut(value = "userCache",key = "#user.id")
    public User save(@RequestBody User user){
        userMapper.insert(user);
        return user;
    }

@CachePut(value = "userCache",key = "#user.id"),可以根据user参数进行解析出来。

数据验证:

接口方法如下:

接口调试方法如下:

方法进入接口中:

结果如下:

4、@CacheEvict

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

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

接口方法1:

java 复制代码
    @CacheEvict(value = "userCache",key = "#id")
    @DeleteMapping
    public void deleteById(Long id){
        userMapper.deleteById(id);
    }

接口方法2:

java 复制代码
    @CacheEvict(value = "userCache",allEntries = true)
	@DeleteMapping("/delAll")
    public void deleteAll(){
        userMapper.deleteAll();
    }

,key = "#id"是删除单个key,allEntries=true的时候是删除所有的key

运行结果:

相关推荐
qq_406981034 小时前
大白话rust系列08 当变量遮蔽遇上引用,探究变量遮蔽的本质
开发语言·后端·rust
ReStock活库4 小时前
Zephyr异步SPI调用返回后,为什么不能立即复用发送缓冲区?
java·前端·网络
微微%5 小时前
从零搭建一个java开发环境
java·idea2023·jdk17
喵了几个咪5 小时前
GoWind ShortPlay 拆解:不用模型的推荐闭环——埋点回流、三路召回与已看去重
开发语言·后端·微服务·golang·gowind
SimonKing5 小时前
又找到一个纯Java的OCR项目,识别的格式还挺多
java·后端·程序员
lengxuenong5 小时前
区间覆盖问题 · 简明学习手册1
java·学习·算法
?abc!5 小时前
(贪心)621. 任务调度器
java·前端·c#
jason成都5 小时前
rtklib_java PPP-RTK 收官测试:修复 BDS-2 宽巷失效与异常卫星死循环 Bug
java·gnss·rtklib·rtklib_java
Flynn Liang5 小时前
Spring AI ChatClient 详解:system/user/assistant 角色、call 与 stream 到底怎么选
java·人工智能·spring·springai·流式输出·chatclient·java接入大模型
Wang's Blog5 小时前
Java 项目实战: 交友项目 - 喜欢与取消喜欢
java·开发语言·交友