HyperLogLog的用法
简直就是天生用于UV统计的,太爽了!
测试百万数据的统计
/**
* info memory
* 2107168
* 插入1000000条数据后,内存的变化
* 2121552
*/
@Test
void testHyperLogLog(){
String[] values = new String[1000];
int j = 0;
for(int i=0; i<1000000; i++){
j = i%1000;
values[j] = "user_" + i;
if(j == 999){
// 发送到redis
stringRedisTemplate.opsForHyperLogLog().add("hl2", values);
}
}
// 统计数量
Long count = stringRedisTemplate.opsForHyperLogLog().size("hl2");
System.out.println("count = " + count);
}
我们这里没有真正的实现UV统计,但是我们在测试中测试1000000条数据,可以看出我们的内存占用非常小,而且误差也非常小。
即使将来需要实现的话,其实难度也不是很大,直接把这些实现就可以了。
当高并发环境下的用户打过来的时候,我们把数据直接往HyperLogLog中放就可以了,误差完全可以接受。