Redis Bloom布隆过滤器
布隆过滤器原理
1、当一个元素加入布隆过滤器时,会使用Bloom Filter中的哈希函数(哈希函数的个数可以自己定义)对元素进行计算,然后得到值(几个哈希函数就有几个值)
2、根据得到的哈希值,在位数组中把下标为哈希值下面的值设置为1(默认只为0)
3、如果需要检测一个元素是否存在的时候,则只需要在此调用这几个哈希函数对元素进行计算,看计算出来的哈希值对应的下标是否都为1,如果一个不为1,则说明该元素一定不存在。布隆过滤器只能判断元素是否一定不存在,而不能判断元素一定存在。
假设 我们往布隆过滤器中添加了alibaba和Tencent两个元素
元素alibaba,用三个hash函数计算出来的值分别为2,4,5,这三个位置都置为1
元素Tencent用三个hash函数计算出来的值分别为1,3,6,这三个位置都置为1
此时我们要判断xiaomi这个元素是否存在
计算出xiaomi,三个hash函数计算出来的值分别为1,2,6,在我们的布隆过滤器中未添加xiaomi这个元素,但是这三个位置都为1。所以得出结论:布隆过滤器只能判断元素是否一定不存在,而不能判断元素一定存在。
布隆过滤器运用场景
-
在一个十亿级别的数据中判断某一些数据是否存在
方法一:在关系型数据库中通过查询,这种方法准确性很高,但是数据量比较大,查询速度比较慢
方法二:将这十亿级别的数据全部set到Redis缓存中,这样查询准确性和速度都有,但是占用的内存空间比较大,GB级别,浪费内存
方法三:通过将数据添加到布隆过滤器中,此时布隆过滤器占用的内存是kb级别的,此方法的查询速度很快,内存占用很小,但是存在一定的误差,如果你的应用场景允许存在一定的误差,此方法最佳。
-
爬虫/ 邮箱等系统的过滤:平时不知道你有没有注意到有一些正常的邮件也会被放进垃圾邮件目录中,这就是使用布隆过滤器 误判 导致的
-
过滤一些恶意的URL请求
布隆过滤器的优缺点
优点:
- 二进制组成的数组,占用的内存小,查询和插入速度快
缺点:
- 随着数据的增加,误判率会增加,存在一定的判断误差(利用增加哈希函数可以减少一定量的判断误差)
- 无法删除数据