文章目录

  • 一、为什么要使用位图
  • 二、什么是位图
  • 三、布隆过滤器
  • 四、位图的常见使用场景
    • 4.1 生成看似无规律却呈趋势递增的号段式ID
    • 4.2 搜索引擎爬虫网页去重
    • 4.3 大型网站每天UV数量统计
  • 五、结语

一、为什么要使用位图

我们先来看一个问题,假设我们有1千万个不同的整数需要存储,每个整数的大小范围是1到1亿。然后,给定任意一个整数X,我们需要判断X是否在刚才的1千万个整数内。这个问题该如何处理呢?

常规的做法肯定就是先考虑如何存储这1千万个整数,在Java中,int类型是4个字节,可以表示的范围区间是-2147483648~2147483647,所以每个整数都用int来表示是可行的。那么1千万个整数需要占用多少内存空间呢?两者相乘就是了,应该是4000万字节,也就是40MB。

而且如果我们存放的整数是是一亿个,每个整数大小范围是1到100亿怎么办?占用的内存空间将会是非常巨大的,是普通的计算机或者手机不能接受的。

所以我们需要使用位图这种数据结构来大大节省内存的使用量。

二、什么是位图

我们知道Byte表示字节,一个字节等于8bit,这里的bit就和位图有关系。在上面的例子中,我们不是要存放1千万个整数嘛,那就申请一个具有1千万个bit的数组,用每个bit(二进制位)来表示一个整数,当前bit为0表示不存在这个整数,为1表示该整数就存在。

虽然数量是1千万个,但是每个数的范围是1到1亿,所以我们需要1亿个bit,换算下来,就是12.5MB,和刚才的40MB相比,节省的不是一点点。

三、布隆过滤器

位图也不是万能的,倘若我们需要存放的1千万个整数的范围是1到100亿怎么办,按道理说,我们申请一个包含100亿个bit的数组就可以了,也是需要1.25GB,太大了,这也是很多电脑和手机承受不起的,那怎么办呢?

布隆过滤器就是让我们有办法在原来12.5MB的内存空间下,使用1亿个bit来存放原本需要100亿个bit才能解决的问题。我们的核心思想就是使用hash函数,把1到100亿大小的数值映射到1到1亿个bit内。

但是这肯定会造成冲突的,鸽巢理论就告诉过我们这一点了。那我们就使用多个不同的hash函数,来把同一个值映射到1到1亿bit中的不同位置上,如此,我们使用多个bit的值来表示一个数值是否存在。对于两个不同的数值来说,经过同一个hash处理得到的值可能会冲突,但是经过多个hash处理得到的多个值就不太可能全部冲突的。

上图:布隆过滤器的工作原理

当我们将某个整数放到内存中时,把它所有hash出来的bit都置为1;当我们需要判断给定的整数X是否已经存在时,就去读取所有的hash出来的bit值,只要有一个不是1,那么就说明这个值不存在;

但是如果所有hash出来的bit值都是1,也不能一定说明这个值X就是已经存在的,布隆过滤器会对结果为存在的情况发生误判。

上图:布隆过滤器发生误判的场景示意

当我们加入的数据越来越多,位图中为0的bit越来越少的时候,布隆过滤器发生误判的概率就会越来越高了。假设我们能提前知道总共有多少数据和数据的范围,我们可以通过调整hash函数的个数、位图的大小来减小误判发生的概率;假设我们并不能提前知道这些,那我们的位图就需要支持自动扩容,当为0的bit小于某个阈值的时候,我们就应该触发扩容位图的操作。

布隆过滤器在对某些可以容忍小概率误判的业务场景非常有效。

四、位图的常见使用场景

4.1 生成看似无规律却呈趋势递增的号段式ID

4.2 搜索引擎爬虫网页去重

4.3 大型网站每天UV数量统计

五、结语

下一篇会实战使用位图来实现抖音号、淘淘号等需要生成看似无规律却呈趋势递增的号段式ID

为什么亿级数据量时要使用位图?位图和布隆过滤器有什么关系?相关推荐

  1. Mongodb亿级数据量的性能测试zz

    进行了一下Mongodb亿级数据量的性能测试,分别测试如下几个项目: (所有插入都是单线程进行,所有读取都是多线程进行) 1) 普通插入性能 (插入的数据每条大约在1KB左右) 2) 批量插入性能 ( ...

  2. Mongodb亿级数据量的性能测试比较完整收藏一下

    原文地址: http://www.cnblogs.com/lovecindywang/archive/2011/03/02/1969324.html 进行了一下Mongodb亿级数据量的性能测试,分别 ...

  3. Mongodb亿级数据量的性能测试

    进行了一下Mongodb亿级数据量的性能测试,分别测试如下几个项目: (所有插入都是单线程进行,所有读取都是多线程进行) 1) 普通插入性能 (插入的数据每条大约在1KB左右) 2) 批量插入性能 ( ...

  4. mongodb每秒写入量_Mongodb亿级数据量的性能测试

    进行了一下Mongodb亿级数据量的性能测试,分别测试如下几个项目: (所有插入都是单线程进行,所有读取都是多线程进行) 1) 普通插入性能 (插入的数据每条大约在1KB左右) 2) 批量插入性能 ( ...

  5. 千亿级数据量的Kafka深度实践

    来自:DBAplus社群 本文根据严锁鹏老师在[2019 DAMS中国数据智能管理峰会]现场演讲内容整理而成. 讲师介绍 严锁鹏,奇虎360大数据架构运维专家,具有10年基础架构与大数据开发经验.20 ...

  6. 360 千亿级数据量的 Kafka 深度实践

    讲师介绍 严锁鹏,奇虎360大数据架构运维专家,具有10年基础架构与大数据开发经验.2013年加入360商业化团队,负责消息中间件开发与运维,同时涉及大数据架构.微服务架构.实时计算平台.机器学习平台 ...

  7. 挨踢部落直播课堂第十期:亿级数据量高并发下数据库水平切分的结构设计

    转自:http://tn.51cto.com/article/373 内容介绍 1.大数据量时,数据库架构设计原则 2.数据库水平切分架构设计方向 3.用户中心,帖子中心,好友中心,订单中心水平切分架 ...

  8. MySQL亿级数据量实时同步,小米如何完美hold住

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"1024"获取公众号专属1024GB资料 作者丨刘心光 来源丨小米云技术(ID:mi- ...

  9. 亿级数据量场景下,如何优化数据库分页查询方法?

    摘要:刷帖子翻页需要分页查询,搜索商品也需分页查询.当遇到上千万.上亿数据量,怎么快速拉取全量数据呢? 本文分享自华为云社区<大数据量性能优化之分页查询>,作者: JavaEdge. 刷帖 ...

最新文章

  1. layui 导航收缩代码_pycharm的十个小技巧,让你写代码效率翻倍
  2. 一文读懂阿里云数据库Autoscaling是如何工作的
  3. android 按钮中断,android – 如何“中断”在AccessibilityService中执行的操作?
  4. 线性代数、概率 入门书籍推荐
  5. Java高级语法笔记-普通异常处理
  6. Deep Learning快速学习方法
  7. python用模块读取xml文件_Python之xml文档及配置文件处理(ElementTree模块、ConfigParser模块)...
  8. c51汇编语言extrn data,ASM51调用C51函数的实现
  9. AT88SC104 加密认证过程
  10. gatedata graph digitier 基本使用
  11. Java_键盘输入语句
  12. maven安装及配置(详细版)
  13. 如何判断本地(路由器)分配的IP是否是公网IP?
  14. 系统安装:双系统启动菜单
  15. 办公室常见问题解决:不能连接局域网的共享打印机
  16. onnx优化系列 - 获取中间Node的inference shape的方法
  17. B站入局直播电商,流量的终点就是带货?
  18. Carrying Conundrum CodeForces - 1567C
  19. 惯性传感器阵列导航模块OSMIUM MIMU4X9C/4X4C介绍
  20. 手把手教你使用Newstart HA

热门文章

  1. create-react-app :无法加载文件 C:\Users\Administrator\AppData\Roaming\npm\create-react-app.ps1,因为在此系统上禁止运行
  2. 【今日学长】来自柚子帮学长--什么?这几家伦敦的餐厅你还没吃过?
  3. 2018年美亚杯电子数据取证大赛-团体赛
  4. Android:高仿百度外卖、美团、淘点点二级联动效果!
  5. android 手机usb 驱动安装
  6. 甜品消消乐知识点总结
  7. 家谱树(gentree)
  8. 试题 算法训练 猴子分苹果
  9. 互联网常用的网络用语
  10. 极客爱情 2.0.1| 从你的编程世界路过