由于当前系统并没有足够的用户数据量、所以这里我们需要模拟实现UV统计 为了看出HLL占用内存大小、我们先查看一下当前Redis内存占用情况
shell
#查看Redis内容
info memory
当前Redis已占用内存大小为3591808 Byte,used_memory_human为3.43MB
- 存储模拟用户数据
java
/**
* 执行testHyperLogLog相关业务逻辑。
*
* 作用:
* 1.每1000次,添加一次,添加到Redis;
* 2.统计数量;
*
* @return无返回值
*/
@Test
void testHyperLogLog() {
String[] values = new String[1000];
for (int i = 0; i < 1000000; i++) {
values[i % 1000] = "user_" + i;
// 每1000次,添加一次,添加到Redis
if (i % 1000 == 999) {
stringRedisTemplate.opsForHyperLogLog().add("hl2", values);
}
}
// 统计数量
Long count = stringRedisTemplate.opsForHyperLogLog().size("hl2");
System.out.println("count = " + count); // count = 997593
}在使用info memory查看HLL存储100w条数据后内存:3602896 Byte,与上次相差11,088/1024=10.828125KB,误差率为(1000000 - 997593) / 1000000 ≈ 0.2407%

总结:HyperLogLog统计数据量基本准确,并且还能过滤重复元素,存储海量数据占用内存极低,满足了大数据量的UV统计。