开篇思考

你能想到哪些方式判断一个元素是否存在集合中?

布隆过滤器并不存储数据本身,那么是怎么做到过滤的?

布隆过滤器实现?参数配置?

一般我们用来判断一个元素是否存在,会想到用 List,Map,Set 等,会将元素先保存下来,然后进行筛选。 但是这样的形式都有一个弊端就是一定要保存数据才行,可是我们仅仅想知道是否存在数据,并不要求获取实际数据,

这时候就会觉得这种方式实在是浪费空间。

什么情况下我们只需要判断是否存在这个元素呢? 在系统设计的时候,我们会考虑大量并发的形式,但是很多请求可能是在访问不存在的数据,

那么我们就没有必要继续这个请求,可以在 API 网关层就直接过滤掉。

Bloom Filter 布隆过滤器原理

Bloom filter 是由 Howard Bloom 在 1970 年提出的二进制向量数据结构,它具有很好的空间和时间效率,

被用来检测一个元素是不是集合中的一个成员。

布隆过滤器实现是不保存数据本身,而是通过 K 个 hash 函数来计算在 byte[] 数组中的存放位置,

并把这个位置的值设置为 1, 而这个 K 到底是多少个呢,要根据公式来算出,待会列出。 除了这个 K 值,我们还要计算 byte[] 数组的长度 m ,下面一并列出计算公式:

fpp : 误判率参数,(must be 0 < fpp < 1)

n :预估的需要过滤的总数量

ln :求对数,不会的把高中老师的名字写下来

m :数组长度

n :预估的需要过滤的总数量

下面我们以数字 11 为例来使用,有个网站可以测试布隆过滤器,

在线测试布隆

布隆过滤器的优点、缺点

优点:

节省空间,不用保存所有数据,知识通过 hash 值来计算位置,并通过 byte[] 记录下来。

速度快,时间复杂度低 O(1);

缺点:

精度低,假设:a 计算的位置 1 ,3 ;b 计算的位置 5,7;c 计算的位置 1,7,那么 c 一定存在吗?

不能直接删除,因为想要删除就要把对应的位置置为 0 ,如果这样做,可能会影响其他值的过滤。

布隆过滤器实现

这个其实在 google guava 包中有现成的实现,不用我们自己去实现。我们看看是怎么实现的;

/**

* 计算 bit 数组的长度公式

* n : 预估数据量

* p : 误差率 0-1

*/

@VisibleForTesting

static long optimalNumOfBits(long n, double p) {

if (p == 0.0D) {

p = 4.9E-324D;

}

return (long)((double)(-n) * Math.log(p) / (Math.log(2.0D) * Math.log(2.0D)));

}

/**

* 计算 hash 函数个数的方法

* n : 预估数据量

* m : bit 数组长度

*/

@VisibleForTesting

static int optimalNumOfHashFunctions(long n, long m) {

return Math.max(1, (int)Math.round((double)(m / n) * Math.log(2.0D)));

}

动手玩一玩

expectedInsertions 代表预估数量,越大越准确,在下面的例子中,可以自己随意设置 p 值,过小会发现后面会返回 true

fpp : 误差率 0-1

import com.google.common.base.Charsets;

import com.google.common.hash.BloomFilter;

import com.google.common.hash.Funnels;

public class BloomFilterTest {

public static void main(String[] args) {

int expectedInsertions = 800000000;

double fpp = 0.00001;

BloomFilter bloomFilter = BloomFilter.create(Funnels.stringFunnel(Charsets.UTF_8), expectedInsertions, fpp);

int i = 10000;

while (i > 1){

bloomFilter.put("aa" + i);

System.out.println(bloomFilter.mightContain("ab" + i));

i--;

}

}

}

喜欢文章请关注我

布隆过滤器速度_高并发系统一定要考虑的 Bloom Filter 布隆过滤器相关推荐

  1. ios13.5.1降级_高并发系统下的降级如何实现

    前言 服务的降级主要是指当服务负载过高或者出现故障时,将一些非核心业务(负载过高)或者故障业务进行移除或者暂不处理的措施,为其它业务空余出处理资源或者无障碍处理.一般来说在一个系统里面服务降级的流程包 ...

  2. 高并发处理方案_高并发系统下的缓存解决方案

    什么样的数据适合做缓存? 缓存和DB数据一致性在之前已讲过,详细可参考下面阅读推荐<如何保障mysql和redis之间的数据一致性>,我们这里讲一讲缓存穿透.缓存雪崩和击穿的三种场景解决方 ...

  3. mysql每秒支持多少并发_如何设计一个高并发系统?

    面试题 如何设计一个高并发系统? 面试官心理分析 说实话,如果面试官问你这个题目,那么你必须要使出全身吃奶劲了.为啥?因为你没看到现在很多公司招聘的 JD 里都是说啥,有高并发就经验者优先. 如果你确 ...

  4. oom 如何避免 高并发_【面试题】如何设计一个高并发系统?

    面试题 如何设计一个高并发系统? 原文链接:https://github.com/doocs/advanced-java/blob/master/docs/high-concurrency/high- ...

  5. mysql并发量_高并发秒杀系统架构解密,不是所有的秒杀都是秒杀!

    推荐阅读: 学会这些微服务+Tomcat+NGINX+MySQL+Redis,再去面试阿里P7岗吧 "火爆"的微服务架构你还不会?从基础到原理的PDF文档快来学! Nginx负载均 ...

  6. mysql 高并发 响应时间_高并发,你真的了解吗?

    摘要:本文介绍高并发系统的度量指标,讲述高并发系统的设计思路,再梳理高并发的关键技术,最后结合作者的经验做一些延伸探讨. 当前,数字化在给企业带来业务创新,推动企业高速发展的同时,也给企业的IT软件系 ...

  7. 聊一聊作为高并发系统基石之一的缓存,会用很简单,用好才是技术活

    大家好,又见面了. 本文是笔者作为掘金技术社区签约作者的身份输出的缓存专栏系列内容,将会通过系列专题,讲清楚缓存的方方面面.如果感兴趣,欢迎关注以获取后续更新. 在服务端开发中,缓存常常被当做系统性能 ...

  8. 开发高并发系统的三把利器

    在开发高并发系统时有三把利器用来保护系统:缓存.降级和限流.缓存的目的是提升系统访问速度和增大系统能处理的容量,可谓是抗高并发流量的银弹:而降级是当服务出问题或者影响到核心流程的性能则需要暂时屏蔽掉, ...

  9. 【高并发】为何高并发系统中都要使用消息队列?这次彻底懂了!

    来自:冰河技术 写在前面 很多高并发系统中都会使用到消息队列中间件,那么,问题来了,为什么在高并发系统中都会使用到消息队列中间件呢?立志成为资深架构师的你思考过这个问题吗? 本文集结了众多技术大牛的编 ...

最新文章

  1. innodb表空间结构
  2. 网站单页面排名提升的技巧有哪些?
  3. 代码分析:NASM源码阅读笔记
  4. 【转】获取命名空间、类名、方法名
  5. 30天敏捷结果(15) - 保持一个最佳状态的大脑
  6. 音视频技术开发周刊 72期
  7. VueCli3 项目结构和具体作用
  8. 如何把一个网页生成一个快捷方式在桌面?_如何打造一个简洁、高效的桌面?
  9. python骰子游戏分析_python 用python写一个骰子游戏
  10. 更新k8s镜像版本的三种方式
  11. Python深入理解yield
  12. 无头浏览器介绍和对比
  13. 【Office】Word空格无法添加下划线
  14. Locality Sensitive Hashing ( LSH,局部敏感哈希 ) 详解
  15. 苹果装系统提示未能与恢复服务器,恢复系统未能与服务器取得联系 | 手游网游页游攻略大全...
  16. 学习 React.js 需要了解的一些概念
  17. ChatGPT 帮你写情人节文案
  18. Sun工作站Solaris系统设置双屏显示
  19. 聊聊互联网行业对35岁码农的偏见,以及大龄码农的破局之道
  20. python逐行调试_python如何单步调试

热门文章

  1. 苹果因不带充电器被罚款200万美元;杨笠代言英特尔被抵制,品牌方连夜下架;Linux考虑加入对Rust的支持 | 极客头条...
  2. 这道考 switch 控制语句的阿里基础面试题你能答对吗?
  3. 这些反病毒斗争经验,我全放这了!
  4. 宅男、游戏、美女,一场不一样的技术公开课让你老泪纵横
  5. BTCU 分叉,真的是比特币“千年痛点”克星吗?
  6. 达摩院 2020 预测:模块化降低芯片设计门槛 | 问底中国 IT 技术演进
  7. Java 程序员中位数薪资达 1.45 万,但面试屡屡被拒?
  8. 中国 AI 开发者真实现状:写代码这条路,会走多久?
  9. 独家!币安被盗原因找到了!7074 枚比特币竟是这样丢掉的
  10. 5.9 亿国内用户简历遭殃,数据库持续“裸奔”!