目录
1、缓存预热
什么是缓存预热?
缓存预热,顾名思义,是指在系统启动或某一阶段之前,将一些热点数据提前加载到缓存中,以便在需要时能够快速响应请求。缓存预热旨在避免冷启动或冷缓存带来的性能问题。
如何做缓存预热?
缓存预热的实现方式可以根据具体业务需求和技术架构来选择,例如可以通过定时任务,事先加载特定的数据到缓存中;或者在系统启动时,通过一次性加载所有热点数据到缓存中。
2、缓存雪崩
什么是缓存雪崩?
硬件:Redis宕机
软件:Redis中的key大面积在同一时间过期
如何预防?
1.key永不过期
2.高可用集群
3.多缓存策略(本地缓存+Redis)
4.服务降级
5.云Redis
3、缓存穿透
什么是缓存穿透?
缓存穿透是指在缓存系统中,由于多个缓存对象不在Redis中,导致大量请求直接打到后端数据库,且后端数据库也无该数据,使得数据库压力骤增,甚至导致系统崩溃。
如何预防?
方案一:空对象缓存
1.将不存在的key也回写到Redis(此方法不能预防黑客每次使用不同且不存在的key)
方案二:布隆过滤器
2.Guava
Guava布隆过滤器代码案例
package com.toonyoo.guava;
import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class BloomFilterTest {
public static void main(String[] args) {
// 创建一个Guava版本的布隆过滤器 Funnels.integerFunnel()表示判断的元素类型为Integer,fpp是误判率(fpp越小越好)
BloomFilter<Integer> bloomFilter = BloomFilter.create(Funnels.integerFunnel(), 10000000, 0.01);
// 判断元素是否存在
log.info("{}", bloomFilter.mightContain(1));
log.info("{}", bloomFilter.mightContain(2));
// 添加元素
bloomFilter.put(1);
bloomFilter.put(2);
// 再次判断元素是否存在
log.info("{}", bloomFilter.mightContain(1));
log.info("{}", bloomFilter.mightContain(2));
// fpp是什么? 通过查看源码发现,fpp即误判率,将它的数值设置地越小,误判率越低,同时消耗的资源(bit位数+哈希函数个数)也就越多。
}
}
4、缓存击穿
什么是缓存击穿?
缓存击穿是指一个热点数据过期或被删除,同时有大量并发请求访问这个热点数据,导致请求直接落到数据库,引发数据库负载激增的情况。
如何预防?
1.对于热点key不设置过期时间
2.互斥更新,才用双检加锁策略