Redis之HyperLogLog-阿里云开发者社区

开发者社区> 比巴卜-> 正文

Redis之HyperLogLog

简介: Redis之HyperLogLog
+关注继续查看
(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅998元/3年,立即抢购>>>:9i0i.cn/aliyun

福利推荐:阿里云、腾讯云、华为云等大品牌云产品全线2折优惠活动来袭,4核8G云服务器899元/3年,新老用户共享优惠,点击这里立即抢购>>>

HyperLogLog

HLL常用于去重统计(会有一定的误差),例如统计一个页面每天的访问量(每个用户一天访问多次也只能算一次,即UV),注意这里是UV,

如果是PV比较好办,给每个网页配一个独立的计数器即可,把这个计数器的key后缀加上当天的日期,这样每来一个请求,执行incrby指令一次,直接递增即可,最终可以统计出所有的PV,

但是UV不同,需要去重,一般去重可能考虑使用set集合去做,例如存储当天访问该页面的所有用户ID,当一个请求过来的时候,我们使用sadd将用户id塞进去即可,通过scard可以取出这个集合的大小看,这个数字就是这个页面的UV数据,这个方案看似可行,

但是如果一个页面的访问量非常大,一个页面可能有几千万个UV,那就需要很大的set集合来统计,非常浪费空间,如果这样的页面很多,那么将耗费更大的存储空间,

一般页面的访问次数统计并不需要十分精确,例如105万和106万差别并不大,HLL就是一种解决方案,可以做到去重计数的同时,还节省很多的空间,虽然不精准,但是差的并不离谱,标准误差是0.81%,这样的精准度一般可以满足UV统计需求了。

image.png

pfadd/pfcount

HLL提供了两个指令 pfadd/pfcount, 一个是增加计数,一个是获取计数,pfadd和set集合的sadd用法一样,来一个用户ID直接添加进去,pfcount则和scard用法一样,直接获取计数值。


127.0.0.1:6379> pfadd hll user1  # 给hll可以添加一个 user1 的用户id,下面都一样

(integer) 1

127.0.0.1:6379> pfadd hll user2  

(integer) 1

127.0.0.1:6379> pfadd hll user3  

(integer) 1

127.0.0.1:6379> pfadd hll user4

(integer) 1

127.0.0.1:6379> pfadd hll user4 # 此处又添加了一个user4,被过滤

(integer) 0

127.0.0.1:6379> pfadd hll user4

(integer) 0

127.0.0.1:6379> pfcount hll  # 获取总数,发现是4,说明去重成功

(integer) 4

127.0.0.1:6379> pfadd hll user5 user6 user7  # 新添加三个用户id

(integer) 1

127.0.0.1:6379> pfcount hll  # 计数成功

(integer) 7

可以从上面的结果发现,效果很好,结果也是正确的,没有出现所谓的误差率,这是因为我们的数据暂时还太少,下面我们使用脚本多跑一些数据,看看误差率会不会出现。

可以看到,我们一次性添加了10w个数据,最后获取到的总数和预期相差了0.277%,这就是误差了,不会那么精准,

1639038202867.jpg

同样的数据再跑一次,你会发现出来的结果和上面的相同,证明了HLL确实是可以去重的,

代码地址:https://github.com/qiaomengnan16/redis-demo/tree/main/redis-hll

image.png

pfmerge

HLL除了pfadd/pfcount之外,还提供了一个叫 pfmerge的指令,用于将多个pf计数值累加在一起形成一个新的pf值,

有什么作用呢?比如在网站上有两个内容差不多的页面,如果有天这两个页面需要进行合并,UV访问量也需要合并,此时就可以用pfmerge将这两个页面的计数值,放在一起了。

127.0.0.1:6379> pfadd hll1 a b c # hll1 的页面

(integer) 1

127.0.0.1:6379> pfadd hll2 e f g # hll2 的页面

(integer) 1

127.0.0.1:6379> pfcount hll1  # hll1页面的总数

(integer) 3

127.0.0.1:6379> pfcount hll2  # hll2页面的总数

(integer) 3

127.0.0.1:6379> pfmerge hll3 hll1 hll2 # 合并两个页面的总数到hll3中

OK

127.0.0.1:6379> pfcount hll3 # 查看hll3结果

(integer) 6

根据下方的demo同时可以发现,两个uv合并的时候也是会去重的,例如两个页面都有abc,合并在一起的时候,也会进行过滤。

127.0.0.1:6379> pfadd hll1 a b c

(integer) 1

127.0.0.1:6379> pfadd hll2 e f g

(integer) 1

127.0.0.1:6379> pfadd hll2 a b c

(integer) 1

127.0.0.1:6379> pfcount hll1

(integer) 3

127.0.0.1:6379> pfcount hll2

(integer) 6

127.0.0.1:6379> pfmerge hll3 hll1 hll2

OK

127.0.0.1:6379> pfcount hll3

(integer) 6

空间占用

HLL需要占据12KB的存储空间,一般用户量非常小的情况下可能没有空间成本的优势,但是如果用户非常多的情况下的话,12KB节省的存储空间就非常多了,相比Set存储方案,HLL使用的空间只能算是九牛一毛,

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
9473 0
阿里云服务器ECS远程登录用户名密码查询方法
阿里云服务器ECS远程连接登录输入用户名和密码,阿里云没有默认密码,如果购买时没设置需要先重置实例密码,Windows用户名是administrator,Linux账号是root,阿小云来详细说下阿里云服务器远程登录连接用户名和密码查询方法
11179 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的,?mysql的 3306,?mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建. ? have?fun! ?将编程看作是一门艺术,而不单单是个技术。
10839 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
12029 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13152 0
如何设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云安全组设置详细图文教程(收藏起来) 阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程。阿里云会要求客户设置安全组,如果不设置,阿里云会指定默认的安全组。那么,这个安全组是什么呢?顾名思义,就是为了服务器安全设置的。安全组其实就是一个虚拟的防火墙,可以让用户从端口、IP的维度来筛选对应服务器的访问者,从而形成一个云上的安全域。
7378 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
6882 0
+关注
比巴卜-
比巴卜
31
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载


http://www.vxiaotou.com