2019独角兽企业重金招聘Python工程师标准>>>

摘自本人 http://irfen.me/redis-hyperloglog-intro/

我们一直都知道,redis几大常用数据结构,字符串、散列、列表、集合、有序集合。其实后来Redis做了很多补充,其中之一就是HyperLogLog,另外的还有GEO(地理位置),是3.2版本加的。

这里我们就来简单介绍下HyperLogLog结构。

先说用处:这个结构可以非常省内存的去统计各种计数,比如注册ip数、每日访问IP数、页面实时UV(PV肯定字符串就搞定了)、在线用户数等。

这里看到所有的用处都是xxx数,所以这个数据结构的特点就是,可以比较准确的估算出你要统计的数量,但是却无法知道统计的详细内容。比如统计每日访问IP数,可以获取当时访问过的IP总数量,但是没法知道这些IP都是什么。

有得必有失,当然你要统计上面提到的那些内容,可以用集合来处理,这样可以知道数量,也能获得所有的详细列表。但是一个大型的网站,每天IP比如有100万个呢,我们粗算一个IP消耗15字节,那么100万个IP就是15M,如果1千万,就是150M。

再来看看我们的HyperLogLog,在Redis中每个键占用的内容都是12K,理论存储近似接近2^64个值,不管存储的内容是什么。12K,知道这个数据结构的作用了吧。这也是为什么他不能知道里面的详细内容了。这是一个基于基数估算的算法,只能比较准确的估算出基数,可以使用少量固定的内存去存储并识别集合中的唯一元素。而且这个估算的基数并不一定准确,是一个带有 0.81% 标准错误(standard error)的近似值。

这里当你记录的内容越多,和集合使用的内容就越容易产生鲜明的对比,因为HyperLogLog结构,在范围允许的情况下无论多少值,都置灰占用12K内存。

这样比如我们把每日IP记录下来,假设每天有一亿个IP访问,如果使用集合的话,一天的内存使用就是1.5G,假设我们存储一个月的记录,就需要45G容量。但是使用HyperLogLog的话,一天12K,一个月360K。如果我们不需要知道IP具体信息的话,完全可以把这些记录留在内存一年、或者不删都行。如果需要,我们也会把所有的IP访问记录通过其他途径存储起来。把每天的信息存储起来,我们可以计算每月IP总数(MERGE),一年的IP总数等(去重)。

下面介绍一下HyperLogLog的命令,其实他和集合的命令比较像,只是命令少,不能获取列表而已。另外这个数据结构需要2.8.9及以上的版本才能使用哦~

PFADD

在执行这个命令之后,HyperLogLog内部的结构会被更新,并有所反馈,如果执行完之后HyperLogLog内部的基数估算发生了变化,那么就会返回1,否则(认为已经存在)就返回0。
这个命令还有一个比较神器的就是可以只有键,没有值,这样的意思就是只是创建空的键,不放值。
如果这个键存在,不做任何事情,返回0;不存在的话就创建,并返回1。

这个命令的时间复杂度为O(1),所以就放心用吧~

命令例子:

1

2

3

4

5

6

7

8

redis> PFADD  ip:20160929  "1.1.1.1"  "2.2.2.2"  "3.3.3.3"

(integer) 1

redis> PFADD  ip:20160929 "2.2.2.2"  "4.4.4.4"  "5.5.5.5"  # 存在就只加新的

(integer) 1

redis> PFCOUNT  ip:20160929  # 元素估计数量没有变化

(integer) 5

redis> PFADD  ip:20160929 "2.2.2.2"  # 存在就不会增加

(integer) 0

其实我们发现在少的时候还是挺准的,哈哈。

PFCOUNT

其实在上面的学习中我们已经用过这个了,这里再来介绍下。

当命令作用于单个键的时候,返回这个键的基数估算值。如果键不存在,则返回0。
当作用于多个键的时候,返回这些键的并集估算值。类似于把这些键都合并了之后,在调用这个命令输出。

这个命令在作用于单个值的时候,时间复杂度为O(1),并且具有非常低的平均常数时间;在作用于N个值的时候,时间复杂度为O(N),这个命令的常数复杂度会比较低些。

命令例子:

1

2

3

4

5

6

7

8

redis> PFADD  ip:20160929  "1.1.1.1"  "2.2.2.2"  "3.3.3.3"

(integer) 1

redis> PFCOUNT  ip:20160929

(integer) 3

redis> PFADD  ip:20160928  "1.1.1.1"  "4.4.4.4"  "5.5.5.5"

(integer) 1

redis> PFCOUNT  ip:20160928  ip:20160929

(integer) 5

PFMERGE

合并(merge)多个HyperLogLog为一个HyperLogLog。其实这个也很好理解,而合并后的估算基数也近似于所有HyperLogLog估算基数的并集。

这个命令的第一个参数为目标键,剩下的参数为要合并的HyperLogLog。命令执行时,如果目标键不存在,则创建后再执行合并。

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

命令例子:

1

2

3

4

5

6

7

8

redis> PFADD  ip:20160929  "1.1.1.1"  "2.2.2.2"  "3.3.3.3"

(integer) 1

redis> PFADD  ip:20160928  "1.1.1.1"  "4.4.4.4"  "5.5.5.5"

(integer) 1

redis> PFMERGE ip:201609   ip:20160928   ip:20160929

OK

redis> PFCOUNT  ip:201609

(integer) 5

本文原创与赵伊凡BLOG,转载注明出处。

到此HyperLogLog所有的命令就都介绍完了,没错,目前就只有这三个。其实也很简单的,知道了这个结构的用法,也就知道什么时候适合用了,对我们非常珍贵的内存还是很有帮助。

转载于:https://my.oschina.net/u/617688/blog/776198

Redis基数统计——HyperLogLog小内存大用处相关推荐

  1. Redis 基数统计:HyperLogLog 小内存大用处

    https://blog.csdn.net/azhegps/article/details/71158952 我们一直都知道,redis几大常用数据结构,字符串.散列.列表.集合.有序集合.其实后来R ...

  2. Redis基数统计之HyperLogLog小内存大用处

    转载:https://blog.csdn.net/azhegps/article/details/71158952 我们一直都知道,redis几大常用数据结构,字符串.散列.列表.集合.有序集合.其实 ...

  3. Redis 发布订阅,小功能大用处,真没那么废材!

    假设我们有这么一个业务场景,在网站下单支付以后,需要通知库存服务进行发货处理. 上面业务实现不难,我们只要让库存服务提供给相关的给口,下单支付之后只要调用库存服务即可. 后面如果又有新的业务,比如说积 ...

  4. 生成msk文件的用处_Yotta企业云盘“小”功能大用处企业办公好伙伴

    Yotta企业云盘"小"功能大用处企业办公好伙伴 对于传统的数据存储,Yotta企业云盘可以很好的超越传统存储所面临的挑战. 1.支持本地文件多个同时上传:在网盘中,在需要上传文件 ...

  5. redis 小功能大用处

    慢查询日志分析 redis提供了慢查询日志功能,会计算每条命令的执行时间,超过阈值后记录下来,注意计算的是命令的执行时间,不包含网络传输和排队时间. config get slowlog-log-sl ...

  6. 【redis 学习系列08】Redis小功能大用处02 Pipeline、事务与Lua

    3.Pipeline 3.1 Pipeline概念 Redis客户端执行一条命令分为如下四个过程: (1)发送命令 (2)命令排队 (3)命令执行 (4)返回结果 其中(1)和(4)称为Round T ...

  7. redis小功能大用处-bitmaps

    转载于:https://www.cnblogs.com/gogogofh/p/11288414.html

  8. vivo手机怎么投屏到电脑_小功能大用处!vivo手机的智慧投屏,轻松实现“跨屏显示”...

    随着网络科技的发展,手机在生活中起着越来越重要的作用,不仅能够看视频玩游戏,甚至还能实现轻办公.由于目前处于特殊时期,不少企业和学校不得不延长假期,纷纷开展远程办公.远程学习的模式.虽然手机能完成很多 ...

  9. 小设计大用处 笔记本接口知识

    出于便携的考虑,通常笔记本都是采取外部扩展的方式来增加功能和用途,所以丰富的外部扩展接口/端口显得尤为重要.不过还是有许多朋友在购买笔记本的时候对产品接口的认识不是很多,常常被经销商的介绍弄得一头雾水 ...

最新文章

  1. js表单验证,如果不为空时自动改变提交按钮的背景色
  2. Maven的生命周期和maven-assembly-plugin插件使用
  3. HQL查询(分页查询,动态sql查询,参数查询)
  4. zookeeper 分布式过程协同技术详解.pdf_阿里大牛耗时18个月整理这份ZooKeeper分布式详解文档...
  5. tcm可信密码模块linux,基于可信密码模块的可信电子签名终端设计与实现
  6. 2016级算法期末模拟练习赛-A.wuli51和京导的毕业旅行
  7. SpringMVC的数据响应-回写数据
  8. 修改rpm中的文件重新打包
  9. [企业内部https证书配置]tomcat 7配置https的完整历程
  10. XSRF(XSS+CSRF)
  11. TankGame1.0
  12. 【语音编码】基于matlab PCM编解码【含Matlab源码 555期】
  13. 利用MATLAB实现人脸识别GUI程序设计
  14. 数据结构与算法: Asymptotic Analysis 渐近分析
  15. GT540M最新驱动(windows XP 32位),安装NDIVIA安装程序无法继续解决方法
  16. 【YOLOV5-5.x 源码解读】plots.py
  17. Android手机清除锁屏密码
  18. cta 音频测试_CTA入网认证一般测试哪些项目流程
  19. 获取比Administrator还高的权限——SYSTEM权限
  20. Leetcode题解 二分查找

热门文章

  1. nginx下的session一致性
  2. MacApp开发Error Domain=NSURLErrorDomain Code=-1003 A server with the specified hostname could not be
  3. python程序员面试宝典 勘误_《前端面试江湖》勘误合集(二)
  4. 读书笔记-大型网站技术架构(核心原理与案例分析)
  5. 阿里面试题,为什么wait()方法要放在同步块中?
  6. Leetcode 252, 253. Meeting Rooms
  7. C# 将DataTable数据源转换成实体类
  8. CUBRID学习笔记 1 简介 cubrid教程
  9. Sql中的递归问题-思考与建议
  10. 对于生活服务小公司网站的看法