如何使用1GB内存对30亿个QQ号去重

文章介绍了如何利用Redis的位图(Bitmap)功能来高效存储大量的QQ号码,通过1位二进制标记QQ号的存在与否,大大减少了内存占用。在30亿个QQ号的情况下,只需要约357.63MB的内存,远低于直接存储的11.18GB。示例代码展示了如何使用RedisTemplate进行操作。
摘要由CSDN通过智能技术生成

       现在市场上的QQ号大多是10位数字并且是没有负数的也就是unsigned int,我们按照10位数字来计算,如果是32位操作系统则一个QQ号所占的字节是4个,如果是64位操作系统则一个QQ号占的字节是8个,那么30亿个10位数所占的内存大小为4 * 3000000000 / 1024 / 1024 /1024 ≈ 11.18GB,64位更不用说,很显然1GB是存不下的.

       如果我们实现这个功能可以考虑使用redis中的位图(Bitmap),使用Bitmap的话,我们只需要1位就能判断这个QQ号是否存在,所占的内存大小为:357.63MB,1GB能远远存下,而1个bitmap的最大值为512MB判断30亿个QQ号简直是绰绰有余.

        原理就是我们使用一个bit来标记数字是否存在,一个QQ号可以表示bitmap中的一个位置,如果这个位置是1则表示该QQ号已经存在,是0则表示不存在

@SpringBootTest(classes = ServiceApplication.class)
public class RedisTest {
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    @Test
    public void testBitMap(){
        int qq = 1234567890; // 模拟一个QQ号
        Boolean bit = redisTemplate.opsForValue().setBit("qq", qq, true);// 注册的时候将此QQ号存入bit数组中
        System.out.println(Boolean.TRUE.equals(bit) ? "该QQ已经存在" : "Success");

        Boolean bit1 = redisTemplate.opsForValue().setBit("qq", qq, true);// 模拟又随机生成了一个QQ号
        System.out.println(Boolean.TRUE.equals(bit) ? "该QQ已经存在" : "Success");
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值