引言
在学习Redis的时候我们都会面临一个绕不开的问题--缓存穿透,所谓缓存穿透就是用户(黑客)不断地去请求Redis和数据库中都没有的数据,比如id一般都是从1开始,如果用户不断地请求id=-1,这样不断攻击导致数据库压力过大,甚至击垮数据库。
面对这种情况我们怎么解决呢?
在接口层加上权限校验和参数校验
使用一个非常牛逼的方法——布隆过滤器(BloomFilter)
初识BloomFilter
BloomFilter是一个很长的二进制向量和一系列随机映射函数,用来判断一个元素是否存在于集合中,当一个元素加入集合时,经过一系列Hash运算将这个元素映射到一维数组上的K的点,将这K个点的值置为1.那么检测这个元素是否存在的时候只需要验证数组上的这K个点是否都是1,如果是,那么判断这个元素存在,否则不存在。
BloomFilter的缺陷
可以看到,BloomFilter可以精准的判断出一个元素不在集合中的情况,但是如果有两个元素的Hash运算结果相同,就无法判断两个元素的存在情况,因此BloomFilter存在误判的问题。
除此之外,当我们想把一个元素移除出集合的时候,我们也很难直接将1置为0,因为这样做会影响到其他相同Hash值的元素,因此BloomFilter在删除元素上也非常的不方便。
小总结
布隆过滤器是用于判断一个元素是否在集合中。通过一个位数组和N个hash函数实现。
优点:
空间效率高,所占空间小。
查询时间短。
缺点:
存在误判
很难删除元素----可以使用CountingBloomFilter
参考
(juejin.im/post/5cfd06…)(juejin.im/post/5db693…)
作者:lxh君
链接:https://juejin.im/post/5e919ce3e51d4546d32bd2f0
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。