40亿QQ号,给你1G内存,怎么去重?
给你40亿个QQ号,要求相同的QQ号码仅保留一个,内存限制为1个G,你会怎么实现? 这其实就是个经典的海量数据去重问题,而且还附带一个让人头疼的条件:内存限制只有1G! 理解题目:从QQ号和内存限制说起我们先来分析一下问题本身。 QQ号其实是一串数字,范围是4字节的无符号正整数,也就是32位,理论上最大值接近43亿。所以,如果单纯存储这40亿个QQ号,需要耗费多少内存呢? 简单计算一下: 14000000000*4 /1024/1024/1024 ≈ 15GB 总共需要15GB的内存,显然远远超过了题目给的1GB限制。这就需要我们换个思路,不能“硬塞”,要想办法巧妙地存储和处理这些QQ号。 所以问题的本质就是“在内存非常有限的情况下,高效实现重复数据的去重”。 解决方案有很多,但是主流的方案有两种: 方案1:使用Bitmap 方案2:使用布隆过滤器 两者各有千秋,但在本题中,我们使用BitMap更加合适。 解决方案:用BitMap的精妙之处化繁为简什么是BitMap?所谓位图(BitMap)其实就是一个bit数组,即每一个位置都是一个bit,其中的取值可以是0或者1。 通俗...
什么是缓存一致性问题,如何解决分布式缓存一致性问题?
什么是缓存?将数据源的数据存储到内存中,快速响应请求数据的一种手段。同时缓解了对数据库频繁读写的压力。 什么是分布式缓存?分布式缓存是一种将数据分散到不同的机器上进行存储,方便快速响应请求的一种手段。区别于以往的单机存储,将数据存储在单一的服务器上。 分布式缓存的优点是什么? 提高了单机缓存的容量限制单机缓存受限于一台机器的硬件资源,当数据缓存量庞大时,无法满足容量要求。 解决了单机缓存的单点问题单机缓存由于只有一台机器进行对外提供服务,一旦发生服务器故障或者程序问题,会导致无法争取提供服务,影响可用性。 提高了并发性能单机缓存受限于硬件资源(CPU、内存等)和网络资源(带宽)等,在高并发读写情况下会成为性能瓶颈。 什么是缓存一致性问题?一句话解释就是缓存中的数据和数据存储组件(例如数据库)之间的数据不一致问题。 如何解决缓存一致性问题?旁路缓存模式(Cache Aside) 读:先读取缓存数据,如果缓存中没有就访问数据存储,然后将获取的数据填充到缓存中,再返回。 写:先更新数据存储数据,再更新(删除)缓存。 优点:简单容易实现,适合读多写少的场景。 缺点:写操作时,先更...