HyperLogLog 数据结构 统计数据
UV 不⼀样,它要去重,同⼀个⽤户⼀天之内的多次访问请求只能计数⼀次。这就要求每⼀个⽹⻚请求都需要带上⽤户的 ID,⽆论是登陆⽤户还是未登陆⽤户都需要⼀个唯⼀ ID 来标识。如⼀个爆款⻚⾯⼏千万的UV,你需要⼀个很⼤的 set 集合来统计,这就⾮常浪费空间。如果这样的⻚⾯很多,那所需要的存储空间是惊⼈的
Redis 提供了 HyperLogLog 数据结构就是⽤来解决这种统计问题的。HyperLogLog 提供不精确的去重计数⽅案,虽然不精确但是也不是⾮常不精确,标准误差是0.81%,这样的精确度已经可以满⾜上⾯的 UV 统计需求了。
HyperLogLog 提供了两个指令 pfadd 和 pfcount,根据字⾯意义 很好理解,⼀个是增加计数,⼀个是获取计数。pfadd ⽤法和 set 集合的 sadd 是⼀样的,来⼀个⽤户 ID,就将⽤户 ID 塞进去就是pfcount 和 scard ⽤法是⼀样的,直接获取计数值。
27.0.0.1:6379> pfadd codehole user1 (integer) 1 127.0.0.1:6379> pfcount codehole (integer) 1 127.0.0.1:6379> pfadd codehole user2 (integer) 1 127.0.0.1:6379> pfcount codehole (integer) 2 127.0.0.1:6379>