一、HyperLogLog概述

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

  • HyperLogLog提供了3个命令:pfadd、pfcount、pfmerge

二、添加(pfadd)

pfadd key element [element …]
  • pfadd用于向HyperLogLog添加元素,如果添加成功返回1

  • 例如:下面向一个名为2016_06_06:unique:ids的hyperloglog中添加4个元素

三、计算独立用户数(pfcount)

pfcount key [key …]
  • pfcount用于计算一个或多个HyperLogLog的独立总数

  • 例如:接着上面的演示案例,2016_03_06:unique:ids的独立总数为4:

内存节省效果演示案例

  • ①插入前使用info memory查看一下内存占用率

  • ②下面建立一个名为test.sh的脚本,执行该脚本,向key为2016_05_01:unique:ids的HyperLogLog中插入100万个元素(循环每次插入1000条)

elements=""
key="2016_05_01:unique:ids"
for i in `seq 1 1000000`
do
elements="${elements} uuid-"${i}
if [[ $((i%1000)) == 0 ]];
then
redis-cli pfadd ${key} ${elements}
elements=""
fi
done

  • ③执行完脚本之后,再次查看内存,发现内存只增加了14K左右

  • ④但是,使用pfcount查看结果,发现执行的结果并不止100万个

  • ⑤现在改为使用集合类型进行测试,那么可以看到内存使用率在脚本执行完之后涨到了几十MB,但是独立用户数为100万

elements=""
key="2016_05_01:unique:ids:set"
for i in `seq 1 1000000`
do
elements="${elements} "${i}
if [[ $((i%1000)) == 0 ]];
then
redis-cli sadd ${key} ${elements}
elements=""
fi
done

  • 下图列出了使用集合类型和HperLogLog统计百万级用户的占用空间对比:

数据类型

1天

1月

1年

集合类型

80M

2.4G

28G

HperLogLog

15K

450K

5M

  • 可以看到,HyperLogLog内存占用量小得惊人,但是用如此小空间来估算如此巨大的数据,必然不是100%的正确,其中一定存在误差率。Redis官方给出的数字是0.81%的失误率

四、合并(pfmerge)

pfmerge destkey sourcekey [sourcekey ...]
  • pfmerge可以求出多个HyperLogLog的并集并赋值给destkey

  • 例如:要计算 2016年3月5日和3月6日的访问独立用户数,可以按照如下方式来执行,可以看到最终独立用户数是7:

五、HyperLogLog优缺点与使用建议

  • HyperLogLog内存占用量非常小,但是存在错误率

  • 开发者在进行数据结构选型时只需要确认如下两条即可:

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

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

Redis:19---常用功能之(HyperLogLog)相关推荐

  1. Redis的常用功能

    排序: sort mylist 排序 sort mylist alpha desc limit 0 2 字母排序 sort list by it:* desc by命令 sort list by it ...

  2. 关于AD19常用功能和使用技巧的总结

    关于Altium Designer 19常用功能和使用技巧的总结 文章目录 关于Altium Designer 19常用功能和使用技巧的总结 一.常用功能 原理图 PCB图 想到在更 一.常用功能 原 ...

  3. Redis 的各项功能解决了哪些问题?

    先看一下Redis是一个什么东西 官方简介解释到:Redis是一个基于BSD开源的项目,是一个把结构化的数据放在内存中的一个存储系统,你可以把它作为数据库,缓存和消息中间件来使用.同时支持string ...

  4. Redis 的各项功能到底解决了哪些问题?

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达今日推荐:2020年7月程序员工资统计,平均14357元,又跌了,扎心个人原创100W+访问量博客:点击前往,查看更多 来源 ...

  5. redis rua解决库存问题_【150期】面试官:Redis的各项功能解决了哪些问题?

    点击上方"Java面试题精选",关注公众号 面试刷图,查缺补漏 >>号外:往期面试题,10篇为一个单位归置到本公众号菜单栏->面试题,有需要的欢迎翻阅 阶段汇总集 ...

  6. java redis 管道_4个点让你彻底明白Redis的各项功能

    前言 先看一下Redis是一个什么东西.官方简介解释到:Redis是一个基于BSD开源的项目,是一个把结构化的数据放在内存中的一个存储系统,你可以把它作为数据库,缓存和消息中间件来使用.同时支持str ...

  7. Redis 的各项功能解决了哪些问题?(1024程序员节快乐)

    ‍‍ 先看一下 Redis 是一个什么东西.官方简介解释到: Redis 是一个基于 BSD 开源的项目,是一个把结构化的数据放在内存中的一个存储系统,你可以把它作为数据库,缓存和消息中间件来使用.同 ...

  8. DataScience:初学者进阶数学处理专家,学会Excel中50个常用功能带你飞

    DataScience:初学者进阶数学处理专家,学会Excel中50个常用功能带你飞 目录 初学者进阶数学处理专家,学会Excel中50个常用功能带你飞 1.自动筛选 2.在Excel中字符替换 3. ...

  9. ASP.NET中常用功能代码总结(3)——上传图片到数据库

    ASP.NET中常用功能代码总结(3)--上传图片到数据库<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:offi ...

  10. .NET常用功能和代码[总结与收藏] (转)

    .NET常用功能和代码[总结与收藏] 1. 打开新的窗口并传送参数: 传送参数: response.write("<script>window.open('*.aspx?id=& ...

最新文章

  1. JavaScript中使用console调试程序的坑
  2. 利用GPU实现无尽草地的实时渲染
  3. linux后台运行cat命令,Linux程序前台后台切换
  4. lucene 简单示例
  5. 如何从URL查询字符串获得/附加视图参数(示例)?
  6. 【51单片机快速入门指南】6.4:DHT11、DHT22单总线温湿度传感器
  7. java基数排序 数组_万字长文带你掌握Java数组与排序,代码实现原理都帮你搞明白!...
  8. 14.面向对象-----UML类图
  9. OLAP和OLTP的区别(基础知识) 【转】
  10. 计算机系统-理论-运行时堆栈/栈顶
  11. Android开源项目推荐之「网络请求哪家强」
  12. 无人机“风袭”黄冈|战疫日记
  13. 女生学大数据好还是计算机好?都适合女生吗?就业前景好吗?
  14. 苹果快捷指令——支付宝小程序一键直达:URL Scheme 跳转
  15. UML时序图(Sequence Diagram)学习笔记
  16. 用python3根据配置自动生成自定义图片logo(一键解决图片侵权困扰)
  17. 给大家盘点一下最新版本的Photoshop十大技巧和黑科技
  18. 拉卡拉支付的这些创新功能,你知道吗?
  19. 理解特性阻抗、VSWR 和反射系数(二)
  20. 回溯算法总结(java)

热门文章

  1. 3dmax模型转换为*.FLT格式的建模要点
  2. linux 中 timeval结构体
  3. 设计模式C++实现(3)——建造者模式
  4. 华北水利水电C 语言实验11,华北水利水电大学C语言实验11.doc
  5. 与0xf2值相等的是python_腾讯笔试题涵盖的基础知识
  6. java codepointbefore_Java StringBuilder codePointBefore()方法与示例
  7. LSGO软件技术团队爬山活动
  8. 【转】Windows Azure的账户体系
  9. 详解Class类文件的结构(上)
  10. vscode怎么自动将px转换成vw_基于react/vue移动端适配之px自动转rem、vw