1. 页面统计量
- UV(Unique Visitor)
- 独立访客量,是指通过互联网那个访问、浏览这个网页的自然人。1天内同一个用户多次访问该网站,只记录1次。
- PV(Page View),也交页面访问量或点击量,用户每访问网页的一个页面,记录1次PV,多次打开页面,则记录多次PV。往往用来衡量网站的流量。
UV统计在服务端做会比较麻烦,因为要判断该用户是否已经统计过了,需要将统计过的用户信息保存。但是如果每个访问的用户都保存到Redis中,数据量会非常恐怖。
2. HyperLogLog用法
HyperLogLog(HLL)是一种概率性数据结构,用于估计一个数据集中的不同元素(基数)。它通过使用固定的内存来实现对大数据集基数的近似计数。
2.1. 使用步骤
- 初始化HyperLogLog数据结构:首先,您需要为您的数据集初始化一个HyperLogLog数据结构。这涉及到确定所需的内存大小和所需的精度。内存大小将影响所能处理的数据集大小,而精度将决定结果的准确性。
- 添加元素:一旦初始化了HLL数据结构,您可以将数据集中的元素逐个添加到HLL中。对于每个元素,HLL会产生一个固定长度的哈希值(16kb),并使用这个哈希值来更新数据结构的内部状态。
- 估计基数:一旦所有元素都添加完毕,您可以使用HLL来估计数据集中的不同元素数量。这个估计值可能会有一定的误差,但是随着数据集的增大,误差通常会被控制在一个合理的范围内。
- 合并HLL数据结构(可选):如果您有多个HLL数据结构,您可以将它们合并成一个以便计算它们的联合基数。
- 查询结果:最后,您可以查询HLL数据结构以获取估计的基数值。
2.2. 常用命令
3. 代码实验
尝试插入100万数据
@Test
void testHyperLogLog(){
// 准备数组,装用户数据
String[] users = new String[1000];
// 数组角标
int index = 0;
for (int i = 0; i < 1000000; ) {
i++;
// 赋值
users[index++] = "user_" + i;
// 每1000条发送一次
if(i%1000==0){
index = 0;
stringRedisTemplate.opsForHyperLogLog().add("hll1", users);
}
}
// 统计数量
Long size = stringRedisTemplate.opsForHyperLogLog().size("hll1");
System.out.println("size = " + size);
}
结果为:997593,数据量基本符合。