2024.02.21
缓存雪崩:
缓存击穿:
缓存击穿问题也叫热点Key问题,就是一个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问,会在瞬间给数据库带来巨大的冲击。
常见的解决方案:互斥锁、逻辑过期
缓存击穿解决方式(互斥锁)原理图:
缓存击穿解决方式(逻辑过期)原理图:
互斥锁优点:没有额外的内存消耗、保证一致性、实现简单;互斥锁缺点:线程需要等待导致性能受影响、能有死锁风险;逻辑过期优点:线程无需等待,性能较好;逻辑过期缺点:不保证一致性、有额外内存消耗、实现复杂。
互斥锁:若获取锁失败,则采用Thread.sleep休眠再递归的方式
互斥锁实现流程:
获取和释放锁的方式:
//获取锁
public boolean getMutex(String key){
//相当于执行setnx,key存在时不能插入
Boolean aBoolean = stringRedisTemplate.opsForValue().setIfAbsent(key, "1", 10, TimeUnit.MINUTES);
return BooleanUtil.isTrue(aBoolean);
}
//释放锁
public void deleteMutex(String key){
//删除值
Boolean aBoolean = stringRedisTemplate.delete(key);
}
获取nacos配置值的方法:
@Value("${minio.accessKey}"),其中Data id需要与bootstrap.yml文件中的spring.application.name对应,例子中的结构如下图:
//上传的文件拷贝到临时文件
upload.transferTo(tempFile);(upload为MultipartFile类型)