缓存穿透、缓存击穿与缓存雪崩
1.本质区别
缓存穿透指的是数据库不存在数据,导致无法缓存,每次查询都查数据库,数据库压垮
缓存击穿指的是缓存键值对key过期了,key过期期间,大量请求访问,不经过缓存,直接请求数据库,数据库压垮
缓存雪崩指的是key同时过期,请求不经缓存全部到数据库,数据库压垮
2.根据各自特点解决方案
缓存穿透:
1.查询为null,将null缓存,key过期时间设置短一些,主要防止恶性攻击
2.redisson实现的布隆过滤器,底层bitmap,里面存的是二进制0和1,。开始都是0,一个数据存储,key经过3次hash运算模于数组,找到数组对应索引将0改为1,这样3个数组位置就能表名一个key是存在的,即键值对数据存在。但存在误判(C不存在,hash运算取模,1个值属于A,2个值数据B,A与B均存在,三个数组位置都是1,会误判C存在),概率不超过5%
缓存击穿:
1.使用互斥锁,如redis的setnx设置互斥锁,缓存失效,不立即去数据库查询,先去强锁,哪个线程获得,去数据库查询,获取不到就等待重试查询缓存,这种办法数据强一致性,但性能低,而且可能会死锁。
2.key设置逻辑过期非实际物理过期,设置key的时候,设计一个过期时间字段一起存入缓存中,而不给key设置过期时间。查询的时候,从redis中取出判断时间是否过期,如果过期开通另一线程进行数据同步,当前线程正常返回数据(返回的是旧数据),这种办法性能高,但是无法做到数据强一致性
缓存雪崩:
解决方案将原有失效时间上随机加上随机值,比如1-5分钟随机,这样就不会同一时刻大量的key同时失效,缓存过期时间重复率降低