现在市场上的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");
}
}