什么是缓存的击穿
缓存穿透是指缓存和数据库中都没有的数据,缓存每次都无法命中,因为我们默认不会缓存null 值,导致用户访问 id=-1 这样的数据时,一直都无法命中,这时的用户很可能是攻击者,攻击会导致数据库压力过大。
解决方法:
A.在redis缓存null, 当它再次查询id = -i ,在缓存里面有值,可以不在访问数据库
但是缺点缓存了null 值
B.使用BloomFilter
Bloom Filter是一个占用空间很小、效率很高的随机数据结构,它由一个bit数组和一组Hash算法构成。可用于判断一个元素是否在一个集合中,查询效率很高(1-N,最优能逼近于1)。
在很多场景下,我们都需要一个能迅速判断一个元素是否在一个集合中
1.判断500w条(url)里面是否包含一个url地址;
2.从数十亿个垃圾邮件列表中判断某邮箱是否垃圾邮箱;
3.将已存在的缓存放到布隆中,当黑客访问不存在的缓存时迅速返回避免缓存及DB挂掉
用户访问,先经过一个集合,集合里面有所有的数据标识,当集合里面有标识,代表数据库里面也有标识(判断一个数据在集合里面有没有)
a.当集合里面有,缓存里面有,返回缓存的值
b.缓存里面没有,查询数据库。