扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
这篇文章主要介绍redis数据结构HyperLogLog怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
成都创新互联公司是一家专业从事网站设计制作、成都网站设计的网络公司。作为专业网站制作公司,成都创新互联公司依托的技术实力、以及多年的网站运营经验,为您提供专业的成都网站建设、全网营销推广及网站设计开发服务!
HyperLogLog(下文简称为 HLL)是 Redis 2.8.9 版本添加的数据结构,它用于高性能的基数(去重)统计功能,它的缺点就是存在极低的误差率。
HLL命令是以pf 它是 HyperLogLog 这个数据结构的发明人 Philippe Flajolet 的首字母缩写
pfadd key elemnet [element]
pfadd 添加元素,如果添加成功返回1
127.0.0.1:6379> pfadd 2019-04-29:unique:ids u1 u2 u3 u4(integer) 1
计算一个或多个HyperLogLog的独立总数
127.0.0.1:6379> pfcount 2019-04-29:unique:ids(integer) 4127.0.0.1:6379> pfadd 2019-04-29:unique:ids u1 u2 u3 u5(integer) 1127.0.0.1:6379> pfcount 2019-04-29:unique:ids(integer) 5
pfmerge destkey sourcekey [sourcekey ]
计算多个HyperLoglog的并集并赋值给destkey
127.0.0.1:6379> pfadd 2019-04-30:unique:ids u4 u2 u3 u6 u7(integer) 1127.0.0.1:6379> pfmerge 2019-04:unique:ids 2019-04-29:unique:ids 2019-04-30:unique:idsOK127.0.0.1:6379> pfcount 2019-04:unique:ids(integer) 7
HyperLogLog 内存占用量非常小,但是存在一定误差率,redis官方给出的数字是0.81%的失误率,开发中进行数据选型需要确认如下两条即可:
只是为了计算独立总数,不需要获取单条数据
可以容忍一定误差率。毕竟HyperLogLog 内存占用量非常小
如果统计 PV 那非常好办,给每个网页一个独立的 Redis 计数器就可以了,这个计数器的 key 后缀加上当天的日期。这样来一个请求,incrby 一次,最终就可以统计出所有的 PV 数据。
但是 UV 不一样,它要去重,同一个用户一天之内的多次访问请求只能计数一次。这就要求每一个网页请求都需要带上用户的 ID,无论是登陆用户还是未登陆用户都需要一个唯一 ID 来标识。
你也许已经想到了一个简单的方案,那就是为每一个页面一个独立的 set 集合来存储所有当天访问过此页面的用户 ID。当一个请求过来时,我们使用 sadd 将用户 ID 塞进去就可以了。通过 scard 可以取出这个集合的大小,这个数字就是这个页面的 UV 数据。没错,这是一个非常简单的方案。
但是,如果你的页面访问量非常大,比如一个爆款页面几千万的 UV,你需要一个很大的 set 集合来统计,这就非常浪费空间。如果这样的页面很多,那所需要的存储空间是惊人的。为这样一个去重功能就耗费这样多的存储空间,值得么?其实老板需要的数据又不需要太精确,105w 和 106w 这两个数字对于老板们来说并没有多大区别,So,有没有更好的解决方案呢?
这就是本节要引入的一个解决方案,Redis 提供了 HyperLogLog 数据结构就是用来解决这种统计问题的。HyperLogLog 提供不精确的去重计数方案,虽然不精确但是也不是非常不精确,标准误差是 0.81%,这样的精确度已经可以满足上面的 UV 统计需求了。
HyperLogLog 数据结构是 Redis 的高级数据结构,它非常有用,但是令人感到意外的是,使用过它的人非常少。
HyperLogLog 这个数据结构不是免费的,不是说使用这个数据结构要花钱,它需要占据一定 12k 的存储空间,所以它不适合统计单个用户相关的数据。如果你的用户上亿,可以算算,这个空间成本是非常惊人的。但是相比 set 存储方案,HyperLogLog 所使用的空间那真是可以使用千斤对比四两来形容了。
不过你也不必过于担心,因为 Redis 对 HyperLogLog 的存储进行了优化,在计数比较小时,它的存储空间采用稀疏矩阵存储,空间占用很小,仅仅在计数慢慢变大,稀疏矩阵占用空间渐渐超过了阈值时才会一次性转变成稠密矩阵,才会占用 12k 的空间。
HLL 引入了分桶算法和调和平均数来使这个算法更接近真实情况。
分桶算法是指把原来的数据平均分为 m 份,在每段中求平均数在乘以 m,以此来消减因偶然性带来的误差,提高预估的准确性,简单来说就是把一份数据分为多份,把一轮计算,分为多轮计算。
调和平均数指的是使用平均数的优化算法,而非直接使用平均数。
以上是“Redis数据结构HyperLogLog怎么用”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注创新互联行业资讯频道!
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流