缓存穿透
原因:
缓存穿透的场景是访问到一个永远不可能存在的key,这样的请求缓存会一直命不重,导到无效的DB查询,可被利用做恶意攻击拖垮数据库
解决方案
- 使用BloomFilter,将可使用的key存储在BloomFilter中,访问缓存时不存在的key直接返回
- 根据key到数据库查询得到null值的key,也将null值存到缓存,并设置合适的失效时间
为什么要解决击穿问题
因为key击穿会带来无效的数据库访问,无效的数据库访问会给数据库带来IO压力
缓存雪崩
原因
大量的key在同一时间失效,造成所有请求涌向DB,使DB崩溃
解决方案
将key的过期时间取随机值打散
缓存击穿
原因:
某key本来有值,但某时刻缓存过期了 ,如果此key是一个热点数据那此时会有大量的请求冲向DB,给DB造成较大压力
解决方案
此解决方案有些类似分布式锁的解决方案,假如某时刻某请求发线key的缓存过期了,则调用SETNX key expire_time设置一个短期内将过期的临时key, 只有设置成功了的线程才有权限去查询DB,没设置成功的只能等待,DB查询到结果后再设置原来key到缓存
ps: 缓存击穿和缓存穿透的根本区别是,击穿是缓存来本来有值,但某时刻因为缓存过期了导致请求转到DB,就好向本来有堵墙挡着,突然墙倒塌了,此为击穿,穿透意思是一条被发现了一条畅通无阻的通道