那些年向前冲 大厂二面:Redis的分布式布隆过滤器是什么原理?
欢迎关注头条号:老顾聊技术
精品原创技术分享 , 知识的组装工
问题老顾先来举个常会问到的面试题:现有50亿个电话号码 , 现有10万个电话号码 , 如何要快速准确的判断这些电话号码是否已经存在?
上面的问题可以细化一下 , 也就是50亿个电话号码在数据库中 , 现在要快速、准确的判断提供的10万个电话号码是否存在 。
我们小伙伴们是否脑子中会有以下方案:
1、通过数据库查询:实现快速有点难 。 2、数据预放到内存集合中:50亿*8字节大约40G , 内存太大了 。实际项目中也会遇到类似的问题 , 如垃圾邮件过滤、网络爬虫重复url检测等 , 本质就是判断数据存不存在一个大的集合中 。
那如何去解决呢?这就是我们今天老顾要介绍的布隆过滤器方案 , 我们继续往下看 。
布隆过滤器布隆过滤器是一种类似set的数据结构 , 只是不太准确 , 当判断元素是否存在时返回结果存在但真实不一定存在;当返回不存在时肯定是不存在 , 所以判断去重时有一定的误判概率 。
当然 , 误判只会发生在过滤器没有添加过的元素 , 对于添加过的元素不会发生误判 。
特点:高效地插入和查询 , 占用空间少 , 返回的结果是不确定性的 。
布隆过滤器原理这个是由柏顿.布隆在1970年提出 , 用很小的空间 , 解决上述的类似问题 。
实现原理就是我们需要一个很长的二进制数组(也叫向量);在添加数据时 , 使用多个hash函数对key进行hash运算得到一个索引值(即二进制数组的索引值)
k=0.7*(1/n)
f=0.6185^(L/n)
1、位数组相对长度越长 , 错误率越低;2、位数组相对长度越长 , 需要的hash函数越多;3、当一个元素平均需要一个字节(8bit)的指纹空间时(L/n=8) , 错误率大约为2% 。 实际元素超出时f=(1-0.5^t)^k#t为实际元素与预计元素的倍数1、当错误率为10%时 , 倍数比为2时 , 错误率接近40%;2、当错误率为1% , 倍数比为2时 , 错误率15%;3、当错误率为0.1% , 倍数为2时 , 错误率5%以上小伙伴们只要知道会存在误差就行了 , 不需要强求是怎么计算的
Redis布隆过滤器的基本使用在Redis中 , 布隆过滤器有两个基本命令 , 分别是:
bf.add:添加元素到布隆过滤器中 , 类似于集合的sadd命令 , 不过bf.add命令只能一次添加一个元素 , 如果想一次添加多个元素 , 可以使用bf.madd命令 。 bf.exists:判断某个元素是否在过滤器中 , 类似于集合的sismember命令 , 不过bf.exists命令只能一次查询一个元素 , 如果想一次查询多个元素 , 可以使用bf.mexists命令 。 >bf.addone-more-filterfans1(integer)1>bf.addone-more-filterfans2(integer)1>bf.existsone-more-filterfans3(integer)1>bf.existsone-more-filterfans4(integer)0>bf.maddone-more-filterfans4fans5fans61)(integer)12)(integer)13)(integer)1>bf.mexistsone-more-filterfans4fans5fans6fans71)(integer)12)(integer)13)(integer)1布隆过滤器的高级使用上面的例子中使用的布隆过滤器只是默认参数的布隆过滤器 , 它在我们第一次使用bf.add命令时自动创建的 。 Redis还提供了自定义参数的布隆过滤器 , 想要尽量减少布隆过滤器的误判 , 就要设置合理的参数 。
推荐阅读
- 罗云熙|盘点那些古装帅,现代装却很“丑”的3位男神,罗云熙任嘉伦上榜
- 大众报业·海报新闻|盘点那些低价转让的公司,长城宽带100万元打包转让
- 【】长城宽带100万元打包转让 盘点那些低价转让的公司
- 时尚广州|T恤的标语你了解过吗?揭秘衣服上那些奇怪的字句
- 刘药师话用药|有一种健康和美丽,从脚下开始,足部护理那些事儿
- 穿搭日记|那些一眼就让人爱上的明星耳环,便宜的才几百,陈小纭金晨都在戴
- 穿搭|那些乘风破浪的姐姐们,为什么每次都能把职业装穿得美出圈?
- 穿搭■为什么气质上总是输一大截?来看看那些教科书式的穿搭吧,学起来
- 那些年向前冲|三星可能会关闭在天津的电视工厂
- 那些年向前冲|HAVE2020上海高级视听展小记
