前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >40亿QQ号,如何去重?

40亿QQ号,如何去重?

原创
作者头像
BLACK595
发布2024-09-18 16:12:04
1610
发布2024-09-18 16:12:04

前言

首先我们来看看如果要存储40亿QQ号需要多少内存?我们使用无符号整数存储,一个整数需要4个字节,那么40亿需要4*4000000000/1024/1024/1024≈15G,在业务中我们往往需要更多的空间。而且在Java中并不存在无符号整形,只有几个操作无符号的静态方法。

1GB = 1024MB,1MB = 1024KB,1KB = 1024B, 1B = 8b

很显然这种存储是不太优雅的,对于这种大数据量的去重,我们可以使用位图Bitmap。

Bitmap

Bitmap,位图,首先看它的名字,比特map,首先我们听到map,一般都有去重的功能,bitmap听名字就像使用bit存储的map。确实,位图是使用bit数组表示的,它只存储0或者1,因此我们可以把全部的QQ号放到位图中,当index位置为1时表示已经存在。

image.png
image.png

假如我们要判断2924357571是否存在,那么我们只需要看index为2924357571的值是否为1,如果为1则表示已经存在。

位图使用1个比特表示一个数是否存在,那么使用无符号整数表示QQ号,4字节2^32-1是4294967295,内存需要4294967295/8/1024/1024≈512MB。

使用Java编程时,我们使用位图一般是通过的redis,在redis中位图常用的是以下三个命令:

命令

功能

SETBIT key offset value

设置指定offset位置的值,value只能是0或1

GETBIT key offset

获取指定offset位置的值

BITCOUNT key start end

获取start到end之间value为1的数量

演示

GIF 2024-7-27 22-33-37.gif
GIF 2024-7-27 22-33-37.gif

其他作用

  1. 大数据量去重,Bitmap其极致的空间用在大数据量去重非常合适的,除了QQ号去重,我们还可以用在比如订单号去重;爬取网站时URL去重,爬过的就不爬取了。
  2. 数据统计,比如在线人员统计,将在线人员id为偏移值,为1表示在线;视频统计,将全部视频的id为偏移存储到Bitmap中。
  3. 布隆过滤器(BloomFilter),布隆过滤器的基础就是使用的位图,只不过布隆过滤器使用了多个哈希函数处理,只有当全部的哈希都为1,才表示这个值存在。布隆过滤器布隆过滤器一般会使用多个哈希函数,计算出对应的hash对应多个位图下标值,如果都为1,表示这个值存在。
image.png
image.png

例如hutool工具中布隆过滤器的实现类BitMapBloomFilter默认就提供了5个哈希函数。

代码语言:java
复制
public BitMapBloomFilter(int m) {
    int mNum =NumberUtil.div(String.valueOf(m), String.valueOf(5)).intValue();
    long size = mNum * 1024 * 1024 * 8;
    
    filters = new BloomFilter[]{
       new DefaultFilter(size),
       new ELFFilter(size),
       new JSFilter(size),
       new PJWFilter(size),
       new SDBMFilter(size)
    };
}

优点:相较位图,布隆过滤器使用多个hash算法,我们就可以给字符串或对象存进去计算hash了,不像位图一样只能使用整形数字看偏移位置是否为1。

缺点:可能产生哈希冲突,如果判断某个位置值为1,那么可能是产生了哈希冲突,所以,布隆过滤器会有一定误差。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • Bitmap
    • 演示
      • 其他作用
      相关产品与服务
      大数据
      全栈大数据产品,面向海量数据场景,帮助您 “智理无数,心中有数”!
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档