Redis--BloomFileter学习笔记

引言

在学习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

来源:掘金

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(Redis--BloomFileter学习笔记)