redis | 十、redis之HyperLogLog

赛博朋克
• 阅读 1295
redis系列文章:
https://liudongdong.top/categ...
本篇来源:
https://liudongdong.top/archi...
公众号:雨中散步撒哈拉
备注:欢迎关注公众号,一起学习,共同进步!

一、HyperLogLog基数统计

HyperLogLog,下面简称为HLL,它是 LogLog 算法的升级版,作用是能够提供不精确的去重计数。存在以下的特点:

  1. 代码实现较难。
  2. 能够使用极少的内存来统计巨量的数据,在 Redis 中实现的 HyperLogLog,只需要12K内存就能统计2^64个数据。
  3. 计数存在一定的误差,误差率整体较低。标准误差为 0.81% 。
  4. 误差可以被设置辅助计算因子进行降低。

稍微对编程中的基础数据类型内存占用有了解的同学,应该会对其只需要12K内存就能统计2^64个数据而感到惊讶。为什么这样说呢,下面我们举下例子:

取 Java 语言来说,一般long占用8字节,而一字节有8位,即:1 byte = 8 bit,即long数据类型最大可以表示的数是:2^63-1。对应上面的2^64个数,假设此时有2^63-1这么多个数,从 0 ~ 2^63-1,按照long以及1k = 1024字节的规则来计算内存总数,就是:((2^63-1) * 8/1024)K,这是很庞大的一个数,存储空间远远超过12K。而 HyperLogLog 却可以用 12K 就能统计完。

1. pfadd元素添加

将除了第一个参数以外的参数存储到以第一个参数为变量名的HyperLogLog结构中.

这个命令的一个副作用是它可能会更改这个HyperLogLog的内部来反映在每添加一个唯一的对象时估计的基数(集合的基数).

如果一个HyperLogLog的估计的近似基数在执行命令过程中发了变化, PFADD 返回1,否则返回0,如果指定的key不存在,这个命令会自动创建一个空的HyperLogLog结构(指定长度和编码的字符串).

如果在调用该命令时仅提供变量名而不指定元素也是可以的,如果这个变量名存在,则不会有任何操作,如果不存在,则会创建一个数据结构(返回1).

了解更多HyperLogLog数据结构,请查阅PFCOUNT命令页面.

返回值
integer-reply

如果 HyperLogLog 的内部被修改了,那么返回 1,否则返回 0 .

实例

127.0.0.1:6379> pfadd hll one two three four
(integer) 1
127.0.0.1:6379> pfadd hll five sex
(integer) 1
127.0.0.1:6379>

2. pfcount元素统计(不重复统计)

Hyperloglog 是用来做基数统计的数据类型

假设有如下一个数据集 { 1, 3, 5, 7, 9, 5 },那么这个数据集的基数就是 { 1, 3, 7, 9},基数即是值一个数据集中的不重复元素

返回值
integer-reply:

PFADD添加的唯一元素的近似数量.

实例

127.0.0.1:6379> pfcount hll
(integer) 6

3. PFMERGE元素合并

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

合并得出的 HyperLogLog 会被储存在目标变量(第一个参数)里面, 如果该键并不存在, 那么命令在执行之前, 会先为该键创建一个空的.

返回值
simple-string-reply: 这个命令只会返回 OK.

127.0.0.1:6379> pfadd hll2 1 2 3 4
(integer) 1
127.0.0.1:6379> pfmerge hll3 hll hll2
OK
127.0.0.1:6379> pfcount hll3
(integer) 10
127.0.0.1:6379>
点赞
收藏
评论区
推荐文章
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
peter peter
4年前
Go-连接Redis-学习go-redis包
Redis介绍Redis是一个开源的内存数据结构存储,常用作数据库、缓存和消息代理。目前它支持的数据结构有诸如string、hash、list、set、zset、bitmap、hyperloglog、geospatialindex和stream。Redis内置了复制、Lua脚本、LRU清除、事务和不同级别的磁盘持久性,并通过RedisSentinel
Wesley13 Wesley13
3年前
redis的HyperLogLog实战
序本文主要研究一下redis的HyperLogLog的用场相关命令pfadd每添加一个元素的复杂度为O(1)127.0.0.1:6379pfadduv0907uid1uid2uid3(integer)1添加元素到HyperLogLog中,如果内部有变动返回1,没有
Stella981 Stella981
3年前
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解2016年09月02日00:00:36 \牧野(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fme.csdn.net%2Fdcrmg) 阅读数:59593
Stella981 Stella981
3年前
Redis的8大数据类型,写的真好
!(https://oscimg.oschina.net/oscnet/fdbd36b977d2445d818bea697ac004ac.jpg)来源|blog.itzhouq.cn/redis2最近这几天的面试每一场都问到了,但是感觉回答的并不好,还有很多需要梳理的知识点,这里通过几篇Redis笔记整个梳理一遍。Re
Stella981 Stella981
3年前
Redis从入门到放弃系列(十) Cluster
Redis从入门到放弃系列(十)Cluster本文例子基于:5.0.4RedisCluster集群高可用方案,去中心化,最基本三主多从,主从切换类似Sentinel,关于Sentinel内容可以查看编者另外一篇【Redis从入门到放弃系列(九)Sentinel(https://www.o
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Stella981 Stella981
3年前
Nginx + lua +[memcached,redis]
精品案例1、Nginxluamemcached,redis实现网站灰度发布2、分库分表/基于Leaf组件实现的全球唯一ID(非UUID)3、Redis独立数据监控,实现订单超时操作/MQ死信操作SelectPollEpollReactor模型4、分布式任务调试Quartz应用
Stella981 Stella981
3年前
Redis系列1
本文只讲有关于在 WindowsC中使用Redis所需要用到的资源,不涉及在C中使用Redis的编程示例,整体过程我把它分为三个步骤,并按标题的顺序逐一实现。1、下载并安装Redis服务需要先下载Redis服务,并安装于操作系统中,安装步骤和安装其它的Windows程序一样,这里就不花多余的花篇幅讲了。根据自身操作系统下载适用的
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
3年前
Redis持久化问题定位与优化技巧
今天主要分享继Redis持久化方式RDB、AOF之后的一些常用的Redis问题定位于优化方式。Redis持久化方式RDB(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzU3OTc1MDM1Mg%3D%3D%
赛博朋克
赛博朋克
Lv1
何必去怀念犯过的错何必去遗憾那些如果.
文章
5
粉丝
0
获赞
0