Java---Spring---SpringCache

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

SpringCache入门学习

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为特别大不存在的数据。这时的用户很可能是攻击者攻击会导致数据库压力过大。

解决

  1. 接口层增加校验如用户鉴权校验id做基础校验id<=0的直接拦截
  2. 从缓存取不到的数据在数据库中也没有取到这时也可以将key-value对写为key-null缓存有效时间可以设置短点如30秒设置太长会导致正常情况也没法使用。这样可以防止攻击用户反复用同一个id暴力攻击

缓存击穿

定义

缓存击穿是指缓存中没有但数据库中有的数据一般是缓存时间到期这时由于并发用户特别多同时读缓存没读到数据又同时去数据库去取数据引起数据库压力瞬间增大造成过大压力

解决

  1. 设置热点数据永远不过期。
  2. 加互斥锁

缓存雪崩

定义

缓存雪崩是指缓存中数据大批量到过期时间而查询数据量巨大引起数据库压力过大甚至down机。和缓存击穿不同的是 缓存击穿指并发查同一条数据缓存雪崩是不同数据都过期了很多数据都查不到从而查数据库。

解决

1.缓存数据的过期时间设置随机防止同一时间大量数据过期现象发生。
2.如果缓存数据库是分布式部署将热点数据均匀分布在不同的缓存数据库中。
3.设置热点数据永远不过期。

如有不足请多指教
未完待续持续更新
大家一起进步

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: SpringJava