资讯专栏INFORMATION COLUMN

Redis HyperLogLog

xi4oh4o / 2457人阅读

摘要:作为这个命令的副作用,内部可能会被更新,以便反映一个不同的唯一元素估计数量也即是集合的基数。命令返回的可见集合基数并不是精确值,而是一个带有标准错误的近似值。返回值整数回复给定包含的唯一元素的近似数量。返回值字符串回复返回。

HyperLogLog简介

​ HyperLogLog 并不是一种新的数据结构(实际类型为字符串类型),而是一种基数算法,通过 HyperLogLog 可以利用极小的内存空间完成独立总数的统计,数据集可以是 IP、Email、ID 等。

命令 添加 PFADD

自2.8.9可用。

时间复杂度:每添加一个元素的复杂度为 O(1) 。

语法:PFADD key element [element ...]
说明:

将任意数量的元素添加到指定的 HyperLogLog 里面。

作为这个命令的副作用, HyperLogLog 内部可能会被更新, 以便反映一个不同的唯一元素估计数量(也即是集合的基数)。

如果 HyperLogLog 估计的近似基数(approximated cardinality)在命令执行之后出现了变化, 那么命令返回 1 , 否则返回 0 。 如果命令执行时给定的键不存在, 那么程序将先创建一个空的 HyperLogLog 结构, 然后再执行命令。

调用 PFADD 命令时可以只给定键名而不给定元素:

              - 如果给定键已经是一个 HyperLogLog , 那么这种调用不会产生任何效果;

但如果给定的键不存在, 那么命令会创建一个空的 HyperLogLog , 并向客户端返回 1

返回值:

整数回复: 如果 HyperLogLog 的内部储存被修改了, 那么返回 1 , 否则返回 0 。

示例:
coderknock> PFADD  databases  "Redis"  "MongoDB"  "MySQL"
(integer) 1

coderknock> PFCOUNT  databases
(integer) 3

coderknock> PFADD  databases  "Redis"    # Redis 已经存在,不必对估计数量进行更新
(integer) 0

coderknock> PFCOUNT  databases    # 元素估计数量没有变化
(integer) 3

coderknock> PFADD  databases  "PostgreSQL"    # 添加一个不存在的元素
(integer) 1

coderknock> PFCOUNT  databases    # 估计数量增一
4
计算总数 PFCOUNT

自2.8.9可用。

时间复杂度:当命令作用于单个 HyperLogLog 时, 复杂度为 O(1) , 并且具有非常低的平均常数时间。 当命令作用于 N 个 HyperLogLog 时, 复杂度为 O(N) , 常数时间也比处理单个 HyperLogLog 时要大得多。

语法:PFCOUNT key [key ...]
说明:

PFCOUNT 命令作用于单个键时, 返回储存在给定键的 HyperLogLog 的近似基数, 如果键不存在, 那么返回 0

PFCOUNT 命令作用于多个键时, 返回所有给定 HyperLogLog 的并集的近似基数, 这个近似基数是通过将所有给定 HyperLogLog 合并至一个临时 HyperLogLog 来计算得出的。

通过 HyperLogLog 数据结构, 用户可以使用少量固定大小的内存, 来储存集合中的唯一元素 (每个 HyperLogLog 只需使用 12k 字节内存,以及几个字节的内存来储存键本身)。

命令返回的可见集合(observed set)基数并不是精确值, 而是一个带有 0.81% 标准错误(standard error)的近似值。

举个例子, 为了记录一天会执行多少次各不相同的搜索查询, 一个程序可以在每次执行搜索查询时调用一次 PFADD , 并通过调用 PFCOUNT 命令来获取这个记录的近似结果。

返回值:

整数回复: 给定 HyperLogLog 包含的唯一元素的近似数量。

示例:
coderknock> PFADD  databases  "Redis"  "MongoDB"  "MySQL"
(integer) 1

coderknock> PFCOUNT  databases
(integer) 3

coderknock> PFADD  databases  "Redis"    # Redis 已经存在,不必对估计数量进行更新
(integer) 0

coderknock> PFCOUNT  databases    # 元素估计数量没有变化
(integer) 3

coderknock> PFADD  databases  "PostgreSQL"    # 添加一个不存在的元素
(integer) 1

coderknock> PFCOUNT  databases    # 估计数量增一
4
整合 PFMERGE

自2.8.9可用。

时间复杂度:O(N) , 其中 N 为被合并的 HyperLogLog 数量, 不过这个命令的常数复杂度比较高。

语法:PFMERGE destkey sourcekey [sourcekey ...]
说明:

将多个 HyperLogLog 合并(merge)为一个 HyperLogLog , 合并后的 HyperLogLog 的基数接近于所有输入 HyperLogLog 的可见集合(observed set)的并集。

合并得出的 HyperLogLog 会被储存在 destkey 键里面, 如果该键并不存在, 那么命令在执行之前, 会先为该键创建一个空的 HyperLogLog 。

返回值:

字符串回复:返回 OK

示例:
coderknock> PFADD  nosql  "Redis"  "MongoDB"  "Memcached"
(integer) 1

coderknock> PFADD  RDBMS  "MySQL" "MSSQL" "PostgreSQL" "MySQL"
(integer) 1

coderknock> PFMERGE  databases  nosql  RDBMS
OK
# "MySQL" 重复只记一次
coderknock> PFCOUNT  databases
(integer) 6

HyperLogLog 内存占用量非常小,但是存在错误率,开发者在进行数据结构选型时只需要确认如下两条即可:

只为了计算独立总数,不需要获取单条数据。

可以容忍一定误差率,毕竟HyperLogLog在内存的占用量上有很大的优势。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/36400.html

相关文章

  • 用户日活月活怎么统计 - Redis HyperLogLog 详解

    摘要:基本原理是一种概率数据结构,它使用概率算法来统计集合的近似基数。而它算法的最本源则是伯努利过程。伯努利过程就是一直抛硬币,直到落地时出现正面位置,并记录下抛掷次数。对于次伯努利过程,我们会得到个出现正面的投掷次数值其中这里的最大值是。 HyperLogLog 是一种概率数据结构,用来估算数据的基数。数据集可以是网站访客的 IP 地址,E-mail 邮箱或者用户 ID。 基数就是指一个集...

    acrazing 评论0 收藏0
  • Redis学习笔记 - HyperLogLog

    摘要:基数估计就是在误差可接受的范围内,快速计算基数。独立用户统计会有一定的错误几率错误率约为。相关内容学习笔记数据类型与学习笔记数据类型与学习笔记数据类型与学习笔记数据类型与学习笔记数据类型与学习笔记数据类型与学习笔记慢查询日志 什么是 HyperLogLog Redis 在 2.8.9 版本添加了 HyperLogLog 结构。 Redis HyperLogLog 的本质还是字符串。 R...

    seanlook 评论0 收藏0
  • redisHyperLogLog实战

    摘要:最典型的使用场景就是统计网站的每日。实例如下小结的特别是适合用来对海量数据进行统计,对内存占用有要求,而且还能够接受一定的错误率的场景。对于操作由于是,在海量数据层面需要注意慢查询问题。 序 本文主要研究一下redis的HyperLogLog的用场 相关命令 pfadd 每添加一个元素的复杂度为O(1) 127.0.0.1:6379> pfadd uv0907 uid1 uid2 ui...

    luzhuqun 评论0 收藏0
  • Redis篇 - 3. 发布订阅、geo、bitmap、hyperloglog

    1、发布订阅 简介 发布订阅类似于广播功能。redis发布订阅包括 发布者、订阅者、Channel 命令 命令 作用 时间复杂度 subscribe channel 订阅一个频道 O(n) unsubscribe channel ... 退订一个/多个频道 O(n) publish channel msg 将信息发送到指定的频道 O(n+m),n 是频道 channel ...

    marek 评论0 收藏0
  • Redis深入系列-0x011:redis-cli--Redis命令行接口(中)

    摘要:交互模式到目前为止,我们探索了如何像使用命令行程序一样使用。命令将会发送到服务端,运行完成之后将会返回并渲染为简单的可阅读性好的输出。如果用户尝试连接一个不可达的实例,将会进入不可连接模式并在每次输入新的命令的时候重新尝试连接一次。 0x001 交互模式 到目前为止,我们探索了如何像使用命令行程序一样使用redis-cli。这种方式在使用脚本或者测试的时候的确是一种好的方式,但是大多数...

    levy9527 评论0 收藏0

发表评论

0条评论

xi4oh4o

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<