一.概念

1、redis在2.8.9版本添加了HyperLogLog结构;HyperLogLog是一种算法,并非redis独有.
2、redis HyperLogLog是用来做基数统计的算法,HyperLogLog的优点是:在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且使很小的。
3、在redis里面,每个HyperLogLog键只需要花费12kb内存,就可以计算接近2^64个不同元素的基数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
4、目的是做基数统计,故不是集合,不会保存元数据,只记录数量而不是数值

什么是基数
比如数据集{1,3,5,7,5,7,8},那么这个数据集的基数集为{1,3,5,7,8} ,基数(不重复元素)为5个.基数估计就是在误差可接受的范围内,快速计算基数。

例如:网页的 UV (一个人访问一个网站多次,但是还是算作一个人!)
传统的方式, set 保存用户的id,然后就可以统计 set 中的元素数量作为标准判断 !
这个方式如果保存大量的用户id,就会比较麻烦!我们的目的是为了计数,而不是保存用户id

详细说明:

一个非常简单的方案:你也许已经想到了一个简单的方案,那就是为每一个页面一个独立的 set 集合来存储所有当天访问过此页面的用户 ID。当一个请求过来时,我们使用 sadd 将用户 ID 塞进去就可以了。通过 scard 可以取出这个集合的大小,这个数字就是这个页面的 UV 数据。

但是,如果你的页面访问量非常大,比如一个爆款页面几千万的 UV,你需要一个很大的 set 集合来统计,这就非常浪费空间。如果这样的页面很多,那所需要的存储空间是惊人的。为这样一个去重功能就耗费这样多的存储空间,值得么?其实老板需要的数据又不需要太精确,105w 和 106w 这两个数字对于老板们来说并没有多大区别,So,有没有更好的解决方案呢?

Redis 提供了 HyperLogLog 数据结构就是用来解决这种统计问题的。HyperLogLog 提供不精确的去重计数方案,虽然不精确但是也不是非常不精确,标准误差是 0.81%,这样的精确度已经可以满足上面的 UV 统计需求了。

二.相关命令

上面铺垫了这么,其实主要的命令有三个。

1.命令名称:pfadd
功能:
将任意数量的元素添加到指定的HyperLogLog里面。
作为这个命令的副作用,HyperLogLog内部可能会被更新,以便反映一个不同的唯一元素估计数量(也即是集合的基数)。
返回值:
整数回复:如果HyperLogLog的内部储存被修改了,那么返回1,否则返回0.

2.命令名称:pfcount
功能:
当pfcount命令作用于单个键时,返回储存在给定键的HyperLogLog的近似基数,如果键不存在,那么返回0。
当pfcount命令作用于多个键时,返回所有给定HyperLogLog的并集的近似基数,这个近似基数是通过将所有给定HyperLogLog合并至一个临时HyperLogLog来计算得出的。
返回值:
整数回复:给定HyperLogLog包含的唯一元素的近似数量。

3.命令名称:pfmerge
功能:
将多个HyperLogLog合并(merge)为一个HyperLogLog,合并后的HyperLogLog的基数接近于所有输入HyperLogLog的可见集合(observed set)的并集。
返回值:
返回OK

三、测试

127.0.0.1:6379> PFadd mykey a b c d e f g h i j # 创建第一组元素 mykey

127.0.0.1:6379> PFCOUNT mykey # 统计 mykey 元素的基数数量

127.0.0.1:6379> PFadd mykey2 i j z x c v b n m # 创建第二组元素 mykey2

127.0.0.1:6379> PFCOUNT mykey2

127.0.0.1:6379> PFMERGE mykey3 mykey mykey2 # 合并两组 mykey mykey2 => mykey3 并集

127.0.0.1:6379> PFCOUNT mykey3 # 看并集的数量!

四、应用场景

基数不大,数据量不大就用不上,会有点大材小用浪费空间;hyperloglog局限性就是只能统计基数数量,而没办法去知道具体的内容是什么;和bitmap相比,属于两种特定统计情况。

简单来说,HyperLogLog 去重比 bitmap 方便很多,一般可以bitmap和hyperloglog配合使用,bitmap标识哪些用户活跃hyperloglog计数。
  一般使用:

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

十五、Redis三种特殊类型之二HyperLoglog相关推荐

  1. 十四、Redis三种特殊类型之一Geospatial

    一.概述 redis除了提供了五大基本数据类型String.List.Set.Hash.Zset,还有3个比较特殊的数据类型,Geospatial.Hyperloglog.Bitmap,这三个数据类型 ...

  2. 十六、Redis三种特殊类型之三Bitmap

    一.BitMap是什么 通过一个bit位来表示某个元素对应的值或者状态,其中的key就是对应元素本身,value对应0或1,我们知道8个bit可以组成一个Byte,所以bitmap本身会极大的节省储存 ...

  3. Redis三种特殊类型

    文章目录 geospatial 地理空间 geoadd 添加地理位置 geopos geodist geohash georadius georadiusbymember geo底层 hyperlog ...

  4. Redis源码-String:Redis String命令、Redis String存储原理、Redis String三种编码类型、Redis字符串SDS源码解析、Redis String应用场景

    Redis源码-String:Redis String命令.Redis String存储原理.Redis String三种编码类型.Redis字符串SDS源码解析.Redis String应用场景 R ...

  5. 跟我一起学Redis之五种基本类型及其应用场景举例(干了6个小时)

    前言 来啦,老弟?来啦,上一篇就当唠唠嗑,接下来就开始进行实操撸命令,计划是先整体单纯说说Redis的各种用法和应用,最后再结合代码归纳总结. Redis默认有16个数据库(编号为0~15),默认使用 ...

  6. 游戏设计的艺术:一本透镜的书——第十五章 其中一种体验是故事

    这是一本游戏设计方面的好书 转自天之虹的博客:http://blog.sina.com.cn/jackiechueng 感谢天之虹的无私奉献 Word版可到本人的资源中下载 第十五章 其中一种体验是故 ...

  7. Redis三种特殊数据类型——Geospatial地理空间

    Redis三种特殊数据类型:bitmaps位图.hyperloglog基数统计 和 geospatial 地理空间 一.介绍 Redis GEO 用于存储地理位置信息,并对存储的信息进行操作,该功能在 ...

  8. 计算机三种不同类型的用户账户,网络操作系统——Windows Server 2008篇 教学课件 1 作者 刘本军 李建利 [项目5]用户与组的管理.ppt...

    网络操作系统--Windows Server 2008篇 教学课件 1 作者 刘本军 李建利 [项目5]用户与组的管理.ppt (76页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就 ...

  9. 力扣第十五题-三数之和

    前言 力扣第十五题 三数之和 如下所示: 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复 ...

最新文章

  1. ipv4 帧中继配置(GNS3)
  2. javascript与jQuery对照学习总结(一)(一些常规操作)
  3. centos6.6安装python2.7
  4. 怎样从0开始搭建一个测试框架_1
  5. concat与concat_ws区别
  6. Dapr项目应用探索
  7. 2019.03.20 mvt,Django分页
  8. LeetCode 887. 鸡蛋掉落(DP,难、不懂)
  9. LiteIDE 编写Go的单元测试
  10. 收藏 | 机器学习中常用的5种回归损失函数
  11. [Android Pro] Android源码编译之Nexus5真机编译
  12. css中绝对定位和浮动的异同
  13. Vue2.0 的漫长学习ing-2-1
  14. WindowBuilder的使用----java前端的重要框架
  15. PYQT5:基于QsciScintilla的代码编辑器分析10--语法高亮颜色选择
  16. 循环时尚是消费者与电商平台的一场“双向奔赴”?
  17. 谷歌(chrome)浏览器扩展程序
  18. 中文短文本分类实例十四-LEAM(Joint Embedding of Words and Labels for Text Classification)
  19. JavaScript 内存溢出,内存泄漏
  20. ARM-Cortex-M架构寄存器详解

热门文章

  1. 济南计算机中考分数,【更新版】2017济南各初中中考成绩汇总!
  2. Linux中文件描述符1,linux内核中的文件描述符(一)--基础知识简介
  3. c语言函数求方程ax2 bx c,关于求方程ax2+bx+c=0根的问题
  4. oracle部署在mysql_Oracle数据库部署实施流程
  5. ubuntu nginx php-fpm mysql_Ubuntu下安装Nginx,PHP5(及PHP-FPM),MySQL
  6. 大学计算机html,编程基础(C+VB+HTML)(辅)19级计算机
  7. 皮一皮:选第一个选项的人是咋想的?
  8. OAuth 2.0中的scope和RBAC中的role有什么关系
  9. 来活儿了!赶紧检查下代码里有没有脏话...
  10. 据说电脑上可以刷朋友圈啦!又多了个上班摸鱼的途径?