一般我们评估一个网站,主要有两个指标
- pv(page, view),页面访问量
- uv(user,view),访问的用户
一般来说,pv和uv的 统计可以自己来做,也可以借助第三方工具。
自己如何实现:pv;可以通过计数器,key的话加上当前的日期,每当有用户请求的时候,hincrby自增一次,就实现了。但是uv的话,要处理另一个问题,就是去重:
如何去重:需要前端每个用户生成唯一的id,无论是登录还是未登录,都需要一个唯一id,伴随着请求一起到达祸端,在后端,通过sadd,set集合去处理,因为set集合存储的话,是不能存重复的。然后通过scard统计集合的大小。进而得出uv数据。
但是如果有千万个uv,需要的存储空间是非常惊人的,像这种数量特别多的用户访问量的话,以便不需要特别精确。
所以可以使用HyperLogLog去数据类型去统计:
在redis中提供了HyperLogLog,就是专门解决这个问题的,但是不怎么精确,会有误差,误差数据为0.81%。
HyperLogLog一共提供了两个命令:pfadd,和pfcount
它的使用;
public class HyperLogLog { public static void main(String[] args) { Redis redis = new Redis(); redis.execute(jedis -> { for (int i = 0; i < 1000; i++) { jedis.pfadd("uv", "u" + i, "u" + (i + 1)); } long uv = jedis.pfcount("uv"); System.out.println(uv);//理论值是 1001 }); } }
实际打印出来是994.
除了前两个命令,还有一个命令pfmerge,是合并多个统计结果。在合并过程中,会自动去重多个集合中的元素。