雪崩、穿透、击穿解决方案
1、缓存穿透
缓存穿透前提是:Redis和MySQL中都没有,然后不停的直接请求MySQL,会压垮数据库
1.1、问题描述
key对应的数据在数据库MySQL中并不存在,每次针对此key的请求从redis缓存获取不到也不存在,请求都会压到数据库MySQL,从而可能压垮数据库。比如用一个不存在的用户id获取用户信息,不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击就会直接请求MySQL可能压垮数据库。
用户需要查询一个数据,但是redis中没有(比如说mysql中id=-1的数),直接去请求MySQL,当很多用户同时请求并且都么有命中!于是都去请求了持久层的数据库,那么这样会给持久层数据库带来非常大的压力。一般出现这样的情况都不是正常用户,基本上都是恶意用户!
1.2、解决方案
(1) 对空值缓存:如果一个查询返回的数据为空(不管是数据是否不存在),我们仍然把这个空结果(null)进行缓存,设置空结果的过期时间会很短,最长不超过五分钟
当存储层查不到,即使是空值,我们也将其存储起来并且在Redis中设置一个过期