010-redis应用-03- HyperLogLog

一、概述

  Redis 提供了 HyperLogLog 数据结构就是用来解决 这种统计问题的。HyperLogLog 提供不精确的去重计数方案,虽然不精确但是也不是非常不 精确,标准误差是 0.81%

  HyperLogLog 数据结构是 Redis 的高级数据结构

1.1、统计pv、uv

  可以使用的数据结构:incrby、以及集合set操作,但是性能是比较高的,针对可以有误差的情况下。可以使用HyperLogLog 提供了两个指令 pfadd 和 pfcount

1.2、基础使用

  HyperLogLog 提供了两个指令 pfadd 和 pfcount,一个是增加计数,一个是获取计数。pfadd 用法和 set 集合的 sadd 是一样的。pfcount 和 scard 用法是一样的,直接获取计数值。

127.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> pfadd codehole user1 user2 user3 user4 
(integer) 1
127.0.0.1:6379> pfcount codehole
(integer) 4

1.3、pfmerge 适用场合

  HyperLogLog 除了上面的 pfadd 和 pfcount 之外,还提供了第三个指令 pfmerge,用于 将多个 pf 计数值累加在一起形成一个新的 pf 值。

1.4、空间占用

  HyperLogLog 这个数据结构要占据一定 12k 的存储空间,所以它不适合统计单个用户相关的数据。

  如果你的用户上亿,可以算算,这个空间成本是非常惊人的。但是相比 set 存储方案,HyperLogLog 所使用的空间是非常小的。

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

1.5、HyperLogLog 实现原理

  ……

  pf 的内存占用为什么是 12k

    Redis 的 HyperLogLog 实现中用到的是 16384 个桶,也就是 2^14,每个桶的 maxbits 需要 6 个 bits 来存储,最 大可以表示 maxbits=63,于是总共占用内存就是 2^14 * 6 / 8 = 12k 字节。

 

 

 

 

 
posted @ 2020-03-30 15:25  bjlhx15  阅读(216)  评论(0编辑  收藏  举报
Copyright ©2011~2020 JD-李宏旭