Redian新闻
>
40亿个QQ号,限制1G内存,如何去重?

40亿个QQ号,限制1G内存,如何去重?

公众号新闻

40亿个unsigned int,如果直接用内存存储的话,需要:

4*4000000000 /1024/1024/1024 = 14.9G ,考虑到其中有一些重复的话,那1G的空间也基本上是不够用的。

想要实现这个功能,可以借助位图。

使用位图的话,一个数字只需要占用1个bit,那么40亿个数字也就是:

4000000000 * 1 /8 /1024/1024 = 476M

相比于之前的14.9G来说,大大的节省了很多空间。

比如要把我的QQ号"907607222"放到Bitmap中,就需要找到第907607222这个位置,然后把他设置成1就可以了。

这样,把40亿个数字都放到Bitmap之后,所有位置上是1的表示存在,不为1的表示不存在,相同的QQ号只需要设置一次1就可以了,那么,最终就把所有是1的数字遍历出来就行了。

什么是BitMap?有什么用?

位图(BitMap),基本思想就是用一个bit来标记元素,bit是计算机中最小的单位,也就是我们常说的计算机中的0和1,这种就是用一个位来表示的。

所谓位图,其实就是一个bit数组,即每一个位置都是一个bit,其中的取值可以是0或者1

像上面的这个位图,可以用来表示1,4,6:

如果不用位图的话,我们想要记录1,4,6 这三个整型的话,就需要用三个unsigned int,已知每个unsigned int占4个字节,那么就是3*4 = 12个字节,一个字节有8 bit,那么就是 12*8 = 96 个bit。

所以,位图最大的好处就是节省空间。

位图有很多种用途,特别适合用在去重、排序等场景中,著名的布隆过滤器就是基于位图实现的。

但是位图也有着一定的限制,那就是他只能表示0和1,无法存储其他的数字。所以他只适合这种能表示ture or false的场景。

什么是布隆过滤器,实现原理是什么?

布隆过滤器是一种数据结构,用于快速检索一个元素是否可能存在于一个集合(bit 数组)中。

它的基本原理是利用多个哈希函数,将一个元素映射成多个位,然后将这些位设置为 1。当查询一个元素时,如果这些位都被设置为 1,则认为元素可能存在于集合中,否则肯定不存在

所以,布隆过滤器可以准确的判断一个元素是否一定不存在,但是因为哈希冲突的存在,所以他没办法判断一个元素一定存在。只能判断可能存在。

所以,布隆过滤器是存在误判的可能的,也就是当一个不存在的Hero元素,经过hash1、hash2和hash3之后,刚好和其他的值的哈希结果冲突了。那么就会被误判为存在,但是其实他并不存在。

想要降低这种误判的概率,主要的办法就是降低哈希冲突的概率及引入更多的哈希算法。

下面是布隆过滤器的工作过程:

1、初始化布隆过滤器

在初始化布隆过滤器时,需要指定集合的大小和误判率。布隆过滤器内部包含一个bit数组和多个哈希函数,每个哈希函数都会生成一个索引值。

2、添加元素到布隆过滤器

要将一个元素添加到布隆过滤器中,首先需要将该元素通过多个哈希函数生成多个索引值,然后将这些索引值对应的位设置为 1。如果这些索引值已经被设置为 1,则不需要再次设置。微信搜索公众号:架构师指南,回复:架构师 领取资料 。

3、查询元素是否存在于布隆过滤器中

要查询一个元素是否存在于布隆过滤器中,需要将该元素通过多个哈希函数生成多个索引值,并判断这些索引值对应的位是否都被设置为 1。如果这些位都被设置为 1,则认为元素可能存在于集合中,否则肯定不存在。

布隆过滤器的主要优点是可以快速判断一个元素是否属于某个集合,并且可以在空间和时间上实现较高的效率。但是,它也存在一些缺点,例如:

  1. 布隆过滤器在判断元素是否存在时,有一定的误判率。、
  2. 布隆过滤器删除元素比较困难,因为删除一个元素需要将其对应的多个位设置为 0,但这些位可能被其他元素共享。

应用场景

布隆过滤器因为他的效率非常高,所以被广泛的使用,比较典型的场景有以下几个:

1、网页爬虫: 爬虫程序可以使用布隆过滤器来过滤掉已经爬取过的网页,避免重复爬取和浪费资源。

2、缓存系统: 缓存系统可以使用布隆过滤器来判断一个查询是否可能存在于缓存中,从而减少查询缓存的次数,提高查询效率。布隆过滤器也经常用来解决缓存穿透的问题。

3、分布式系统: 在分布式系统中,可以使用布隆过滤器来判断一个元素是否存在于分布式缓存中,避免在所有节点上进行查询,减少网络负载。

4、垃圾邮件过滤: 布隆过滤器可以用于判断一个邮件地址是否在垃圾邮件列表中,从而过滤掉垃圾邮件。

5、黑名单过滤: 布隆过滤器可以用于判断一个IP地址或手机号码是否在黑名单中,从而阻止恶意请求。

微信搜索公众号:架构师指南,回复:架构师 领取资料 。

如何使用

Java中可以使用第三方库来实现布隆过滤器,常见的有Google Guava库和Apache Commons库以及Redis。

如Guava:

import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;
public class BloomFilterExample {
    public static void main(String[] args) {
        // 创建布隆过滤器,预计插入100个元素,误判率为0.01
        BloomFilter<String> bloomFilter = BloomFilter.create(Funnels.stringFunnel(), 1000.01);
        // 插入元素
        bloomFilter.put("Lynn");
        bloomFilter.put("666");
        bloomFilter.put("八股文");
        // 判断元素是否存在
        System.out.println(bloomFilter.mightContain("Lynn")); // true
        System.out.println(bloomFilter.mightContain("张三"));  // false
    }
}

Apache Commons:

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.collections4.BloomFilter;
import org.apache.commons.collections4.functors.HashFunctionIdentity;
public class BloomFilterExample {
    public static void main(String[] args) {
        // 创建布隆过滤器,预计插入100个元素,误判率为0.01
        BloomFilter<String> bloomFilter = new BloomFilter<>(HashFunctionIdentity.hashFunction(StringUtils::hashCode), 1000.01);
        // 插入元素
        bloomFilter.put("Lynn");
        bloomFilter.put("666");
        bloomFilter.put("八股文");
        // 判断元素是否存在
        System.out.println(bloomFilter.mightContain("Lynn")); // true
        System.out.println(bloomFilter.mightContain("张三"));  // false
    }
}

Redis中可以通过Bloom模块来使用,使用Redisson可以:

Config config = new Config();
config.useSingleServer().setAddress("redis://127.0.0.1:6379");
RedissonClient redisson = Redisson.create(config);
RBloomFilter<String> bloomFilter = redisson.getBloomFilter("myfilter");
bloomFilter.tryInit(1000.01);
bloomFilter.add("Lynn");
bloomFilter.add("666");
bloomFilter.add("八股文");
System.out.println(bloomFilter.contains("Lynn"));
System.out.println(bloomFilter.contains("张三"));
redisson.shutdown();

首先创建一个RedissonClient对象,然后通过该对象获取一个RBloomFilter对象,使用tryInit方法来初始化布隆过滤器,指定了最多能添加的元素数量为100,误判率为0.01。

然后,使用add方法将元素"Hollis"、"666"和"八股文"添加到布隆过滤器中,使用contains方法来检查元素是否存在于布隆过滤器中。

或者Jedis也可以:

Jedis jedis = new Jedis("localhost");
jedis.bfCreate("myfilter"1000.01);
jedis.bfAdd("myfilter""Lynn");
jedis.bfAdd("myfilter""666");
jedis.bfAdd("myfilter""八股文");
System.out.println(jedis.bfExists("myfilter""Lynn"));
System.out.println(jedis.bfExists("myfilter""张三"));
jedis.close();

来源:blog.csdn.net/songmulin/article

/details/130814507


推荐

1. 优秀的 Java 代码都是如何分层的 ?看了直呼NB!

2. IDEA新UI速览,成了 VS Code 的样子?

3. 如果有一千万数据,怎么用Java快速查询?

4. 废物利用,拿自己的旧电脑搭建个服务器吧!



最近面试BAT,整理一份面试资料Java面试BATJ通关手册,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
获取方式:点“在看”,关注公众号并回复 Java 领取,更多内容陆续奉上。
PS:因公众号平台更改了推送规则,如果不想错过内容,记得读完点一下在看,加个星标,这样每次新文章推送才会第一时间出现在你的订阅列里。
“在看”支持呀,谢谢啦

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
这个五一,我去重庆恶补当代年轻人的生活方式宏碁推出掠夺者 Hermes DDR5-8000 高频内存,16G*2 4099 元“3亿个岗位将被AI取代”,首批失业潮来了?早报|恒大两年净亏损8120亿;QQ号码3个月未登陆也可能被回收;辽宁一煤矿瞒报7死,4名官员被查;金融圈惊现“天价实习生”楔子40 亿个QQ号,限制 1G 内存,如何去重?【内存】Android C/C++ 内存泄漏分析 unreachable西安最新通报:控制13人!逐一甄别3608名回流生!中国足协两部长被查!4000亿大案,破了[腕表] 腕间世界 百达翡丽5231G珐琅世界时LoRa的3亿个终端节点里,哪些最赚钱?六十 传书炸裂!微软新作LongNet:将Transformer扩展到10亿个Tokens劲爆!Drake演唱会被扔"36G内衣"不淡定了:立刻找到这女人!24GB内存手机!一加 Ace 2 Pro再曝,不是融合的虚拟内存苹果最强芯片深夜炸场!192GB统一内存,单台设备能跑AI大模型最强安卓「游戏机皇」!顶级游戏体验+“巨无霸”内存,14分钟充满...3999元起售为什么小女生总是老男人嘴边的猎物银河系有多“重”?最新数据:也就大约8050亿个太阳吧!台式机(I7-8700/8g/gtx 1060/16g固态缓存盘+1t 硬盘)跑大部分游戏无压力,可升级至16g内存。敲黑板!纽约华人注意,一定要去重新审核,不然失去这项福利。限制or自由?枪支管理何去何从?早鸟报|AppleStore官方商店微信小程序上线;QQ音乐内测情侣亲密体系;腾讯QQ小店小程序将停运...1万朵花制1斤茶,横县三伏天茉莉!手工采摘,花香纯正,古法制作,一口甘甜!五十九 抢收超8.6亿个人客户、1.2万县域网点!农行营收净利双增,回应估值与这"三高"不符特斯拉在复制100年前汽车业传奇?AIoT情报|中国牵头首个6G卫星研究立项;峰值速率2.1Gbps!乘地铁再也不怕没信号;谷歌量子计算几秒完成传统超算47年任务捷翼科技冲刺上交所:拟募资12亿 周立新母子控制100%股权芝奇推出 48GB 单条 DDR5-6800 内存,96GB 套装 4198 元6号,23号,詹姆斯疯狂整活,就为耐克卖球衣?付鹏:大周期已开始变化,巴菲特在复制1982-2002投资逻辑,全球上游都在干一件事情一加将首发24G内存手机;QQ可用微信登录了;“十年登峰之作”荣耀X50官宣品牌年轻化,去重构品类:报喜鸟的品类创新突围策略喜新厌旧新一代笔记本内存标准将至,威刚展示全新 CAMM 内存模块
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。