Redis缓存穿透、缓存击穿、缓存雪崩

68 阅读2分钟

一、缓存穿透

概念:缓存穿透:redis中没有数据,可用还在大量的发起请求,导致越过缓存对数据库进行查询,导致数据崩溃。

如下图:

R-C.png

相当于用户查询一个不存在的数据,到Redis中查,查不到就到数据库中查,数据库查不到就不会放到缓存中,可是后面用户的请求还在源源不断请求,最后都会到数据库层处理,导致数据库崩溃。

解决办法

1.业务层校验

用户的请求,根据请求参数进行校验,校验失败直接返回错误。

2.不存在的数据设置短过期时间

对于一个不存在的数据,在redis中设置过期时间,只要不影响主要业务即可。

3.布隆过滤器

布隆过滤器是一种数据结构,用“极小的内存”来大量判断数据“一定不存在或者可能存在”。

二、缓存击穿

概念:redis中的一个热点key过期时,瞬间大量请求数据,从而全部到达数据库,从而压跨数据库。

28ccc18a004179f24c91bf943e70cea5.png

缓存中某一个热点key过期失效,这时候有大量用户请这个key,就会越过redis直接查询数据库,从而压倒数据库。

解决问题

1.设置热点key永不过期

将redis中的热点key设置为永不过期。这种方式简单粗暴,不推荐

2.定时更新

比如这个热点key设置为1h过期时间,在59分时通过定时任务来更新这个key,并重新设置过期时间

3.互斥锁

这个为解决缓存击穿的常用方法

当查询到key为一个“空值”时给这个key加一个互斥锁,然后在从数据库加载这个key的数据到redis中,再释放锁。若其他线程同时获取这个key时,直接获取错误,并将它睡眠(100ms)后重试。

三、缓存雪崩

概念:Redis中缓存的数据大面积同时失效,或者Redis宕机,从而会导致大量请求直接到数据库,压垮数据库

20210726132546639.png

对于一个业务系统,如果Redis宕机或大面积的key同时过期,会导致大量请求同时打到数据库,这是灾难性的问题。

解决方法

1.过期时间均匀分布

避免大量key过期时间集中,可以给过期时间加一个随机值。

2.数据预热

我们可以自己重新走一边系统,将要缓存的数据放入redis中,并设置均匀分布的过期时间。

3.保证redis服务高可用

通过哨兵模式和集群模式来避免redis单节点故障,来提高reids的高可用性。