Redis深度历险-Redis HyperLogLog不精确的去重计数方案

本文大部分内容引自《Redis深度历险:核心原理和应用实践》,感谢作者!!!

PV和UV

    PV(访问量):即Page View, 具体是指网站的是页面浏览量或者点击量,页面被刷新一次就计算一次。如果网站被刷新了1000次,那么流量统计工具显示的PV就是1000

    UV(独立访客):即Unique Visitor,访问您网站的一台电脑客户端为一个访客。00:00-24:00内相同的客户端只被计算一次

    一个UV可以用很多PV,一个PV也只能对应一个IP。比如,今天访问了一次你的网站,你的UV就加了1,我这次访问浏览了两个页面,你的PV就加2,我访问同一个页面,但刷新了一次,PV也是2

HyperLogLog

Redis HyperLogLog通常用语统计千万级别的UV:https://www.jianshu.com/p/412c96a76723

HyperLogLog特性

1、HyperLogLog提供不精确的去重计数方案,虽然不精确但是也不是非常不精确,标准误差是0.81%

2、HyperLogLog提供了两个指令pfadd和pfcount,根据字面意义很好理解,一个是增加计数,一个是获取计数。pfadd用法和set集合的sadd是一样的,来一个用户ID,就将用户ID 塞进去就是。pfcount和 scard 用法是一样的,直接获取计数值

3、Redis对HyperLogLog的存储进行了优化,在计数比较小时,它的存储空间采用稀疏矩阵存储,空间占用很小;仅仅在计数慢慢变大,稀疏矩阵占用空间渐渐超过了阈值时才会一次性转变成稠密矩阵,才会占用12k的空间

 

PFADD [key] [value ...] #添加指定value到key中
PFCOUNT [key] [value ...] #返回给定key中value在HyperLogLog的基数估算值
PFMERGE [destkey] [sourcekey ...] #将多个HyperLogLog合并为一个HyperLogLog,合并后的HyperLogLog的基数估算值是通过对所有给定HyperLogLog进行并集计算得出的

HyperLogLog实现原理

Redis深度历险-Redis HyperLogLog不精确的去重计数方案_第1张图片

这里的N指的是随机整数的数量,k指的是低位连续零位的最大长度

Redis深度历险-Redis HyperLogLog不精确的去重计数方案_第2张图片

采用多个 BitKeeper,然后进行加权估计,就可以得到一个比较准确的值;实际上这里的Bitkeeper就是后文中提到的桶

Redis深度历险-Redis HyperLogLog不精确的去重计数方案_第3张图片

最低位0的个数最大是63个,2^6 - 1 = 63

你可能感兴趣的:(Redis)