Redis:19---常用功能之(HyperLogLog)
一、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)相关推荐
- Redis的常用功能
排序: sort mylist 排序 sort mylist alpha desc limit 0 2 字母排序 sort list by it:* desc by命令 sort list by it ...
- 关于AD19常用功能和使用技巧的总结
关于Altium Designer 19常用功能和使用技巧的总结 文章目录 关于Altium Designer 19常用功能和使用技巧的总结 一.常用功能 原理图 PCB图 想到在更 一.常用功能 原 ...
- Redis 的各项功能解决了哪些问题?
先看一下Redis是一个什么东西 官方简介解释到:Redis是一个基于BSD开源的项目,是一个把结构化的数据放在内存中的一个存储系统,你可以把它作为数据库,缓存和消息中间件来使用.同时支持string ...
- Redis 的各项功能到底解决了哪些问题?
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达今日推荐:2020年7月程序员工资统计,平均14357元,又跌了,扎心个人原创100W+访问量博客:点击前往,查看更多 来源 ...
- redis rua解决库存问题_【150期】面试官:Redis的各项功能解决了哪些问题?
点击上方"Java面试题精选",关注公众号 面试刷图,查缺补漏 >>号外:往期面试题,10篇为一个单位归置到本公众号菜单栏->面试题,有需要的欢迎翻阅 阶段汇总集 ...
- java redis 管道_4个点让你彻底明白Redis的各项功能
前言 先看一下Redis是一个什么东西.官方简介解释到:Redis是一个基于BSD开源的项目,是一个把结构化的数据放在内存中的一个存储系统,你可以把它作为数据库,缓存和消息中间件来使用.同时支持str ...
- Redis 的各项功能解决了哪些问题?(1024程序员节快乐)
先看一下 Redis 是一个什么东西.官方简介解释到: Redis 是一个基于 BSD 开源的项目,是一个把结构化的数据放在内存中的一个存储系统,你可以把它作为数据库,缓存和消息中间件来使用.同 ...
- DataScience:初学者进阶数学处理专家,学会Excel中50个常用功能带你飞
DataScience:初学者进阶数学处理专家,学会Excel中50个常用功能带你飞 目录 初学者进阶数学处理专家,学会Excel中50个常用功能带你飞 1.自动筛选 2.在Excel中字符替换 3. ...
- ASP.NET中常用功能代码总结(3)——上传图片到数据库
ASP.NET中常用功能代码总结(3)--上传图片到数据库<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:offi ...
- .NET常用功能和代码[总结与收藏] (转)
.NET常用功能和代码[总结与收藏] 1. 打开新的窗口并传送参数: 传送参数: response.write("<script>window.open('*.aspx?id=& ...
最新文章
- JavaScript中使用console调试程序的坑
- 利用GPU实现无尽草地的实时渲染
- linux后台运行cat命令,Linux程序前台后台切换
- lucene 简单示例
- 如何从URL查询字符串获得/附加视图参数(示例)?
- 【51单片机快速入门指南】6.4:DHT11、DHT22单总线温湿度传感器
- java基数排序 数组_万字长文带你掌握Java数组与排序,代码实现原理都帮你搞明白!...
- 14.面向对象-----UML类图
- OLAP和OLTP的区别(基础知识) 【转】
- 计算机系统-理论-运行时堆栈/栈顶
- Android开源项目推荐之「网络请求哪家强」
- 无人机“风袭”黄冈|战疫日记
- 女生学大数据好还是计算机好?都适合女生吗?就业前景好吗?
- 苹果快捷指令——支付宝小程序一键直达:URL Scheme 跳转
- UML时序图(Sequence Diagram)学习笔记
- 用python3根据配置自动生成自定义图片logo(一键解决图片侵权困扰)
- 给大家盘点一下最新版本的Photoshop十大技巧和黑科技
- 拉卡拉支付的这些创新功能,你知道吗?
- 理解特性阻抗、VSWR 和反射系数(二)
- 回溯算法总结(java)
热门文章
- 3dmax模型转换为*.FLT格式的建模要点
- linux 中 timeval结构体
- 设计模式C++实现(3)——建造者模式
- 华北水利水电C 语言实验11,华北水利水电大学C语言实验11.doc
- 与0xf2值相等的是python_腾讯笔试题涵盖的基础知识
- java codepointbefore_Java StringBuilder codePointBefore()方法与示例
- LSGO软件技术团队爬山活动
- 【转】Windows Azure的账户体系
- 详解Class类文件的结构(上)
- vscode怎么自动将px转换成vw_基于react/vue移动端适配之px自动转rem、vw