Redis 缓存穿透、缓存雪崩、缓存击穿的理解和解决方案

Redis 96 浏览

今天被问到缓存的一些问题,缓存穿透、缓存雪崩、缓存击穿这些专属名词还真没了解过。后来了解了下,这些的确是我们必须考虑的,之前没有接触过的确是不应该的,好在赶紧了解下。总结情况如下:

| 缓存流程

正常的缓存流程一般是这样的:

1、发起请求->缓存存在->返回正常数据->End

2、发起请求->缓存不存在->数据库存在->更新缓存->返回正常数据->End

3、发起请求->缓存不存在->数据库不存在->返回空->End

正常的用户请求这种情况下是没问题的,但是总有异常情况,这样我们就要考虑下面的几种情况了。

| 缓存穿透

当遇到缓存不存在,数据库也不存在的时候,用户不断请求(一般是恶意攻击),比如查询条件是id,这时候传id = -1 或者 id = 很大的数值,这样缓存和数据库绝对不存在的情况下,我们认为这就是缓存穿透

解决方案:

1、针对缓存接口进行校验,保证条件在合理范围内,如id <= 0,或者id > 某个临界值的数据直接拦截;

2、缓存不存在,数据库也不存在的情况下,不要直接返回结果,这样被攻击时会大量增加数据库的连接,给数据库造成极大的压力。我们可以将空值存入缓存,缓存时间设置30-60秒,防止数据库压力过大。更加完善点的,可以在此基础上,计算攻击次数,自动加入黑名单等。

| 缓存雪崩

一般是指在某个时间点,缓存同时失效,导致大量查询同时落到数据库上,引起数据库压力过大甚至崩溃。比如在某用户在某一时间点批量缓存了一批数据,设置的缓存过期时间是一至的,当并发情况下,该批缓存同时失效会引起数据库并发查询,给数据库造成极大压力,如果恰好多批缓存都在这个时间点左右失效,甚至会引起服务器宕机;或者缓存服务器节点宕机,刚好处于高并发情况下时(缓存节点宕机是不可预测的),查询落到数据库引起宕机,都会造成雪崩。

解决方案:

1、批量添加缓存时,缓存时间给部分随机数,热门缓存时间长点,冷门缓存时间短点。

2、缓存服务器分布式部署时,热门缓存放在不同服务器上。

3、热点缓存永不过期。

| 缓存击穿

当一个热点缓存并发量巨大,以至于缓存失效瞬间,给数据库造成极大的压力,甚至宕机(一般不太可能,达到这个量级肯定有准备,但不排除某个冷门突然变成热点)。

解决方案:

1、热点缓存设置永不过期。

2、加互斥锁。冷门突然变为热门,没有设置永久缓存时,在失效瞬间重新获取缓存,未获取缓存期间,其他请求等待。


不同的情况选择不同不处理方式吧,量级没达到也不需要处理这么多,不过考虑全面了更好吧。

|  版权声明:本文为博主原创文章,转载请注明出处。