Redis缓存穿透,击穿,雪崩及解决方案
- 缓存穿透:key对应的数据在数据源中并不存在,每次针对此key的请求从缓存获取不到,请求都会到数据源,从而可能压垮数据源。比如:用一个不存在的用户id获取用户信息,不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能会压垮数据库。
- 缓存击穿:key对应的数据存在,但在Redis中过期,此时若大量的并发请求过来,这些请求发现缓存过期,一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会把后端的DB压垮。
- 缓存雪崩:当缓存服务器重启,或者大量缓存集中在某一个时间段失效,这样在失效的时候,也会给后端系统带来很大的压力。
缓存穿透解决方案:
简单粗暴的办法是如果查询到的数据为空(不管是数据不存在还是系统故障),我们仍然把这个空结果缓存,但是设置它的缓存时间一般不超过5分钟。
缓存击穿的解决方案:
业界比较常用的做法,是使用mutex(互斥锁 mutex key)。简单地来说,就是在缓存失效的时候(判断拿出来的值为空),不是立即去load db,而是先使用缓存工具的某些带成功操作返回值的操作(比如Redis的SETNX或者Memcache的ADD)去set一个mutex key,当操作返回成功时,再进行load db的操作并回设缓存;否则,就重试整个get缓存的方法。
缓存雪崩的解决方案:
可以将缓存失效的时间分散开,比如:我们可以在原有的失效时间上加一个随机值(比如1-5分钟随机),这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的情况。