什么是Spring Cache?
Spring Cache是Spring框架的一个模块,它提供了对应用程序方法级别的缓存支持。通过使用Spring Cache,您可以在方法的结果被计算后,将其缓存起来,从而避免相同输入导致的重复计算。
Spring Cache的工作原理
Spring Cache基于注解的方式工作。当您在方法上添加了Spring Cache提供的缓存注解后,Spring会在执行方法前先检查缓存中是否已经存在了方法的返回值。如果缓存中已经有了结果,那么Spring将直接从缓存中获取返回值,并且不会再执行实际的方法体。如果缓存中没有结果,Spring会执行方法的实际逻辑,并将返回值存储到缓存中,以备将来使用。
Spring Cache支持各种缓存提供商,例如Ehcache、Caffeine、Redis等,您可以根据需求来选择合适的缓存实现。
Spring Cache的常用注解
-
@EnableCaching
: 开启缓存注解功能,通常加在启动类上 -
@CachePut
: 该注解也标记在方法上,用于指示方法的结果应该被缓存,但是它在每次调用后都会执行方法体,并将返回值更新到缓存中。 -
@CacheEvict
: 该注解标记在方法上,用于从缓存中移除一个或多个条目。可以指定多个缓存名称或者缓存键,当方法执行时,相关的缓存条目将被从缓存中清除。 -
@Cacheable
: 在方法执行前先查询缓存中是否有数据,如果有数据,则直接返回缓存数据;如果没有缓存数据,调用方法并将方法返回值放到缓存中
Spring Cache的使用场景
Spring Cache非常适合以下情况:
- 频繁访问数据库或其他资源,通过缓存避免重复查询;
- 计算成本较高的方法,通过缓存避免重复计算;
- 实时性要求不高的数据,例如配置信息等;
- 一些通用且不经常改变的数据,例如地区信息、常量等。
起步依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache<artifactId><version>2.7.3</version>
</dependency>
入门案例
数据库准备:
创建名为spring_cache_demo数据库,将springcachedemo.sql(如下:👇)脚本直接导入数据库中。
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (`id` bigint NOT NULL AUTO_INCREMENT,`name` varchar(45) DEFAULT NULL,`age` int DEFAULT NULL,PRIMARY KEY (`id`)
);
引导类上加@EnableCaching:
package com.itheima;@Slf4j
@SpringBootApplication
@EnableCaching//开启缓存注解功能
public class CacheDemoApplication {public static void main(String[] args) {SpringApplication.run(CacheDemoApplication.class,args);log.info("项目启动成功...");}
}
@CachePut注解
@CachePut 说明:
作用: 将方法返回值,放入缓存
value: 缓存的名称, 每个缓存名称下面可以有很多key
key: 缓存的key ----------> 支持Spring的表达式语言SPEL语法
在save方法上加注解@CachePut
当前UserController的save方法是用来保存用户信息的,我们希望在该用户信息保存到数据库的同时,也往缓存中缓存一份数据,我们可以在save方法上加上注解 @CachePut,用法如下:
/*** CachePut:将方法返回值放入缓存* value:缓存的名称,每个缓存名称下面可以有多个key* key:缓存的key*/@PostMapping@CachePut(value = "userCache", key = "#user.id")//key的生成:userCache::1public User save(@RequestBody User user){userMapper.insert(user);return user;}
说明:
#user.id 常用: #user指的是方法形参的名称, id指的是user的id属性 , 也就是使用user的id属性作为key ;
#result.id : #result代表方法返回值,该表达式 代表以返回对象的id属性作为key ;
#p0.id:#p0指的是方法中的第一个参数,id指的是第一个参数的id属性,也就是使用第一个参数的id属性作为key ;
#a0.id:#a0指的是方法中的第一个参数,id指的是第一个参数的id属性,也就是使用第一个参数的id属性作为key ;
#root.args[0].id:#root.args[0]指的是方法中的第一个参数,id指的是第一个参数的id属性,也就是使用第一个参数的id属性作为key ;
@Cacheable
@Cacheable 说明:
作用: 在方法执行前,spring 先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据,调用方法并将方法返回值放到缓存中
cacheNames: 缓存的名称,每个缓存名称下面可以有多个key
key: 缓存的key ----------> 支持Spring的表达式语言SPEL语法
在getById上加注解@Cacheable
/**
* Cacheable:在方法执行前spring先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据, *调用方法并将方法返回值放到缓存中
* cacheNames:缓存的名称,每个缓存名称下面可以有多个key
* key:缓存的key
*/
@GetMapping
@Cacheable(cacheNames = "userCache",key="#id")
public User getById(Long id){User user = userMapper.getById(id);return user;
}
@CacheEvict
@CacheEvict 说明:
作用: 清理指定缓存
cacheNames: 缓存的名称,每个缓存名称下面可以有多个key
key: 缓存的key ----------> 支持Spring的表达式语言SPEL语法
在 delete 方法上加注解@CacheEvict
@DeleteMapping
@CacheEvict(cacheNames = "userCache",key = "#id")//删除某个key对应的缓存数据
public void deleteById(Long id){userMapper.deleteById(id);
}@DeleteMapping("/delAll")
@CacheEvict(cacheNames = "userCache",allEntries = true)//删除userCache下所有的缓存数据
public void deleteAll(){userMapper.deleteAll();
}