一、缓存穿透
概念:缓存穿透:redis中没有数据,可用还在大量的发起请求,导致越过缓存对数据库进行查询,导致数据崩溃。
如下图:
相当于用户查询一个不存在的数据,到Redis中查,查不到就到数据库中查,数据库查不到就不会放到缓存中,可是后面用户的请求还在源源不断请求,最后都会到数据库层处理,导致数据库崩溃。
解决办法
1.业务层校验
用户的请求,根据请求参数进行校验,校验失败直接返回错误。
2.不存在的数据设置短过期时间
对于一个不存在的数据,在redis中设置过期时间,只要不影响主要业务即可。
3.布隆过滤器
布隆过滤器是一种数据结构,用“极小的内存”来大量判断数据“一定不存在或者可能存在”。
二、缓存击穿
概念:redis中的一个热点key过期时,瞬间大量请求数据,从而全部到达数据库,从而压跨数据库。
缓存中某一个热点key过期失效,这时候有大量用户请这个key,就会越过redis直接查询数据库,从而压倒数据库。
解决问题
1.设置热点key永不过期
将redis中的热点key设置为永不过期。这种方式简单粗暴,不推荐
2.定时更新
比如这个热点key设置为1h过期时间,在59分时通过定时任务来更新这个key,并重新设置过期时间
3.互斥锁
这个为解决缓存击穿的常用方法
当查询到key为一个“空值”时给这个key加一个互斥锁,然后在从数据库加载这个key的数据到redis中,再释放锁。若其他线程同时获取这个key时,直接获取错误,并将它睡眠(100ms)后重试。
三、缓存雪崩
概念:Redis中缓存的数据大面积同时失效,或者Redis宕机,从而会导致大量请求直接到数据库,压垮数据库
对于一个业务系统,如果Redis宕机或大面积的key同时过期,会导致大量请求同时打到数据库,这是灾难性的问题。
解决方法
1.过期时间均匀分布
避免大量key过期时间集中,可以给过期时间加一个随机值。
2.数据预热
我们可以自己重新走一边系统,将要缓存的数据放入redis中,并设置均匀分布的过期时间。
3.保证redis服务高可用
通过哨兵模式和集群模式来避免redis单节点故障,来提高reids的高可用性。