7 hyperLogLog

 

HyperLogLog

HyperLogLog 可以接受多个元素作为输入,并给出输入元素的基数估算值:

• 基数:集合中不同元素的数量。比如 {'apple', 'banana', 'cherry', 'banana', 'apple'} 的基数就是 3 。

• 估算值:算法给出的基数并不是精确的,可能会比 实际稍微多一些或者稍微少一些,但会控制在合 理的范围之内。
HyperLogLog 的优点是,即使输入元素的数量或者体积非常非常大,计算基数所需的空间总是固定 的、并且是很小的。
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。

 

相关指令:

1.PFADD key element [element...]

       将任意数量的元素添加到指定的 HyperLogLog 里面。
       这个命令可能会对 HyperLogLog 进行修改,以便反映新的基数估算 值,如果 HyperLogLog 的基数估算 值在命令执行之后出现了变化, 那么命令返回 1 , 否则返回 0 。
     命令的复杂度为 O(N) ,N 为被添加元素的数量。

2.  PFCOUNT key [key ...]

       当只给定一个 HyperLogLog 时,命令返回给定 HyperLogLog 的基数估算值。
      当给定多个 HyperLogLog 时,命令会先对给定的 HyperLogLog 进行并集计算,得出一个合并后的 HyperLogLog ,然后返回这个合并 HyperLogLog 的基数估算值作为命令的结果(合并得出的 HyperLogLog 不会被储存,使用之后就会被删掉)。
     当命令作用于单个 HyperLogLog 时, 复杂度为 O(1) , 并且具有非常低的平均常数 时间。 当命令作用于多个 HyperLogLog 时, 复杂度为 O(N) ,并且常数时间也比处理单个 HyperLogLog 时要 大得多。

 

3.  PFMERGE destkey sourcekey [sourcekey ...]

        将多个 HyperLogLog 合并为一个 HyperLogLog ,合并后的 HyperLogLog 的基数估算值是通过对所有 给定 HyperLogLog 进行并集计算得出的。
       命令的复杂度为 O(N) , 其中 N 为被合并的 HyperLogLog 数量, 不过这个命令的常数复杂度比较高。

 

应用场景
    基数不大,数据量不大就用不上,会有点大材小用浪费空间
    有局限性,就是只能统计基数数量,而没办法去知道具体的内容是什么
    和bitmap相比,属于两种特定统计情况,简单来说,HyperLogLog 去重比 bitmap 方便很多
    一般可以bitmap和hyperloglog配合使用,bitmap标识哪些用户活跃,hyperloglog计数

一般使用:

    统计注册 IP 数
    统计每日访问 IP 数
    统计页面实时 UV 数
    统计在线用户数
    统计用户每天搜索不同词条的个数

 

 

你可能感兴趣的:(Redis)