HyperLogLog实现UV统计

983 词

什么是UV

  • UV

    全称Unique Visitor,也叫独立访客量,是指通过互联网访问、浏览这个网页的自然人。1天内同一个用户多次访问该网站,只记录1次。

  • PV

    全称Page View,也叫页面访问量或点击量,用户每访问网站的一个页面,记录1次PV,用户多次打开页面,则记录多次PV。往往用来衡量网站的流量。

UV统计在服务端做会比较麻烦,因为要判断该用户是否已经统计过了,需要将统计过的用户信息保存。但是如果每个访问的用户都保存到Redis中,数据量会非常恐怖。
所以,我们需要使用HyperLogLog
那么

什么是HyperLogLog

Hyperloglog(HLL)是从Loglog算法派生的概率算法,用于确定非常大的集合的基数,而不需要存储其所有值。

Redis中的HLL是基于string结构实现的,单个HLL的内存永远小于16kb,内存占用低的令人发指!作为代价,其测量结果是概率性的,有小于0.81%的误差。不过对于UV统计来说,这完全可以忽略。

指令只有这三条:

  • PFADD key element [element …]:将任意数量的元素添加到指定的HyperLogLog里面。
  • PFCOUNT key [key …]:当PFCOUNT命令作用于单个键时, 返回给定HyperLogLog的近似基数, 如果键不存在, 那么返回0。当PFCOUNT命令作用于多个键时, 返回所有给定HyperLogLog的并集的近似基数, 这个近似基数是通过将所有给定HyperLogLog合并至一个临时HyperLogLog来计算得出的。
  • PFMERGE destkey sourcekey [sourcekey …]:将多个HyperLogLog合并为一个HyperLogLog , 合并后的HyperLogLog的基数接近于所有输入 HyperLogLog的并集的基数。合并得到的HyperLogLog会被储存在键destkey里面, 如果该键并不存在, 那么命令在执行之前, 会先为该键创建一个空的HyperLogLog。

Java中使用HyperLogLog

1
2
3
4
// 插入数据
stringRedisTemplate.opsForHyperLogLog().add(key, userId.toString());
// 获取数据的数量
stringRedisTemplate.opsForHyperLogLog().size(key);