缓存穿透、击穿、雪崩
一、概念介绍:
1)缓存穿透:在高并发下,查询一个不存在的值时,缓存不会被命中,导致大量请求直接访问数据库;
2)缓存击穿:热点key,缓存过期,直击数据库。比如:秒杀活动的时候,大量用户进行抢购某个商品,而此时刚好key过期了,那么这些请求就直接命中到数据库了。
3)缓存雪崩:大量的缓存key在同一时间失效,导致大量的请求落到数据库上。如活动系统里面同时进行着非常多的活动,但是在某个时间点所有的活动缓存全部过期。
二、解决办法
1)缓存穿透解决办法:
- 在接口层增加校验:比如用户鉴权校验,参数校验,不合法的参数直接代码Return,比如:id做基础校验,id <=0的直接返回;
- 缓存null值:但是缓存NULL的时间不能太长,否则NULL数据长时间得不到更新,也不能太短,否则达不到防止缓存击穿的效果;
- 布隆过滤器(Bloom Filter):类似于哈希表的一种算法,用所有可能的查询条件生成一个bigmap,在进行数据库查询之前会使用这个bitmap进行过滤,如果不在其中则直接过滤,从而减轻数据库层面的压力。
2)缓存击穿解决办法:
- 设置热点key永不过期;
- 使用互斥加锁:对缓存查询加锁,如果key不存在,就加锁,然后查DB入缓存;其他进程如果发现有锁就等待,然后等待解锁后返回数据或者进入DB查询。
3)缓存雪崩解决办法:
- 缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生;
- 设置热点数据永不过期;
三、总结:
1)缓存穿透:查询一个不存在的值时,未命中缓存,直接落到了数据库。解决方案:接口校验、缓存NULL值、Bloom Filter;
2)缓存击穿:热点key,缓存过期,直击数据库。解决办法:设置永不过期、加锁互斥获取数据;
3)缓存雪崩:大量的缓存key在同一时间失效,导致大量请求落到数据库上。解决方案:设置永不过期、随机过期时间;