SpringCache入门学习
- SpringCache介绍
- SpringCatch常用注解
- SpringCatch使用
- 1.导入maven坐标
- 2.配置application.yml
- 3.在启动类上加入@EnableCaching注解,开启缓存注解功能
- 4.在controller的方法上加入@Cacheable,@CacheEvict等注解,进行缓存操作
- 缓存穿透
- 定义
- 解决
- 缓存击穿
- 定义
- 解决
- 缓存雪崩
- 定义
- 解决
SpringCache介绍
Spring Cache是一个框架,实现了基于注解的缓存功能,只需要简单的加一个注解,就能实现缓存功能。 Spring Cache提供了一层抽象,底层可以切换不同的cache实现。具体就是通过CacheManager
接口来统一不同的缓存技术。
CacheManager是Spring提供的各种缓存技术抽象接口。
针对不同的缓存技术需要实现不同的CacheManager:
在spring boot项目中,使用缓存技术只需在项目中导入相关缓存技术的依赖包,并在启动类上使用@EnableCaching
开启缓存支持即可。
例如,在使用Redis作为缓存技术,只需要导入Spring data Redis的maven坐标即可。
SpringCatch常用注解
SpringCatch使用
在SpringBoot项目中使用Spring Cache的操作步骤(使用redis缓存技术):
1.导入maven坐标
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
2.配置application.yml
spring:
redis:
host: 127.0.0.1 # Ip
port: 6379 # 端口
password: 123456 # 密码
database: 0 # 当前redis数据库
cache:
redis:
time-to-live: 1800000 #设置缓存有效期ms
3.在启动类上加入@EnableCaching注解,开启缓存注解功能
@Slf4j
@SpringBootApplication
@ServletComponentScan
@EnableTransactionManagement
@EnableCaching
public class ReggieApplication {
public static void main(String[] args) {
SpringApplication.run(ReggieApplication.class,args);
log.info("项目启动成功");
}
}
4.在controller的方法上加入@Cacheable,@CacheEvict等注解,进行缓存操作
/**
*Cacheable:在方法执行前spring先查看缓存中是否有数据,如果有数据,则直接返回缓存数据,若没有则查询
*value:缓存的名称,每个缓存名称下面可以有多个key
*key:缓存的key
*condition:条件,满足条件才缓存数据
*unless:满足条件则不缓存
*/
@Cacheable(value = "userCache",key = "#id",unless = "#result" == null)
@GetMapping("/{id}")
public User getById(@PathVariable Long id){
User user = userService.getById(id);
return user;
}
/**
*CacheEvict清除缓存
*allEntries = true清除分类所有缓存数据
*/
@CacheEvict(value = "userCache",key = "#p0")
//不同的取值方式
//@CacheEvict(value = "userCache",key = "#root.args[0]")
//@CacheEvict(value = "userCache",key = "#id")
@DeleteMapping("/{id}")
public void delete(@PathVariable Long id){
userService.removeById(id);
}
缓存穿透
定义
缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。
解决
- 接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截;
- 从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击
缓存击穿
定义
缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力
解决
- 设置热点数据永远不过期。
- 加互斥锁
缓存雪崩
定义
缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。和缓存击穿不同的是, 缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。
解决
1.缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
2.如果缓存数据库是分布式部署,将热点数据均匀分布在不同的缓存数据库中。
3.设置热点数据永远不过期。
如有不足,请多指教,
未完待续,持续更新!
大家一起进步!