缓存穿透和缓存雪崩其实是在项目中会遇到的两种情况,它们是两种概念。
缓存穿透:
其实就是你原本在程序和数据库中间做了缓存,程序运行时需要的数据很多可以从缓存中拿取,不用每次都访问数据库,从而给数据库极大的减轻了压力。但是,突然需要查询很多数据库中不存在的数据,数据库中不存在这些数据,自然也没有储存在缓存中。所以造成这些查询绕过了缓存,直接面向数据库查询,造成数据库性能下降。当这样的查询数据很多的话,会给数据库造成极大的压力,造成程序的服务出现问题,严重的甚至宕机。
缓存穿透出现的情况:
由于单机Mysql最大能承受的并发连接数只有1000左右,因此无论是设计失误(如某个高频访问的缓存对象过期),恶意攻击(频繁查询某个数据库中不存在的数据),还是偶发事件(某个社会新闻导致某个热点的搜索量瞬间巨增)等,都会让数据库遭受缓存穿透,从而宕机。
缓存穿透的解决办法:
1,拦截非法的查询请求,仅仅将合理的请求传递给数据库。比如验证码,IP限制等手段限制恶意攻击,并用敏感词过滤器等拦截不合理的非法查询。
2,缓存空对象。比如,在提前知道一个 " 热词 " 将会被大量查询的情况下,在缓存中加入这个将会被用户大量查询的词,在缓存中设置 key="热词",value="",实际上这个数据在数据库中并不存在。这样用户在搜索这个热词的时候就可以直接从缓存中拿到结果,从而避免了对数据库的访问。
3ÿ