Redis高级数据类型-Bitmap和HyperLogLog
位图
位图不是特殊的数据结构,它的内容其实就是普通的字符串,也就是 byte 数组。我们可以使用普通的 get/set 直接获取和设置整个位图的内容,也可以使用位图操作 getbit/setbit 等将 byte 数组看成「位数组」来处理。
当我们要统计月活的时候,因为需要去重,需要使用 set 来记录所有活跃用户的 id,这非常浪费内存。这时就可以考虑使用位图来标记用户的活跃状态。每个用户会都在这个位图的一个确定位置上,0 表示不活跃,1 表示活跃。然后到月底遍历一次位图就可以得到月度活跃用户数。不过这个方法也是有条件的,那就是 userid 是整数连续的,并且活跃占比较高,否则可能得不偿失。
HyperLogLog
HyperLogLog
,下面简称为HLL
,它是 LogLog
算法的升级版,作用是能够提供不精确的去重计数。存在以下的特点:
- 代码实现较难。
- 能够使用极少的内存来统计巨量的数据,在
Redis
中实现的HyperLogLog
,只需要12K
内存就能统计2^64
个数据。 - 计数存在一定的误差,误差率整体较低。标准误差为 0.81% 。
- 误差可以被设置
辅助计算因子
进行降低。
为什么用HyperLogLog
如果要实现这么一个功能:
统计 APP或网页 的一个页面,每天有多少用户点击进入的次数。同一个用户的反复点击进入记为 1 次。
用 HashMap
这种数据结构就可以,假设 APP 中日活用户达到百万
或千万以上级别
的话,我们采用 HashMap
的做法,就会导致程序中占用大量的内存。
估算下 HashMap
的在应对上述问题时候的内存占用。假设定义HashMap
中 Key
为 string
类型,value
为 bool
。key
对应用户的Id
,value
是是否点击进入
。明显地,当百万不同用户访问的时候。此HashMap
的内存占用空间为:100万 * (string + bool)
。
HyperLogLog原理
如图,给定一系列的随机整数,我们记录下低位连续零位的最大长度 k,通过这个 k 值可以估算出随机数的数量。
HyperLogLog与伯努利试验有关,具体可参考HyperLogLog 算法的原理讲解
参考
- Scala的面向对象与函数编程
- ASP.NET AJAX(1)__Microsoft AJAX LibraryASP.NET AJAX(1)__Microsoft AJAX Library
- 大数据流处理平台的技术选型参考
- PHP预定义变量数组种类概览
- PHP网络技术(二)——模拟网络灌水攻防
- PHP Predefined Interfaces 预定义接口
- 如何在咨询项目开展Inception
- PHP网络技术(三)——CURL实现跨服务取接口功能
- PHP网络技术(四)——Socket简介
- PHP网络技术(五)——cookie及记住用户名功能实现
- 数据优化
- Oracle12.2 多租户环境下的授权管理
- PHP网络技术(六)——session及与cookie的比较
- Shell基本操作与命令
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 在虚拟目录中部署 ASP.NET Core 应用
- Docker 容器的健康检查
- 使用 mono 编译 .NET Standard 应用
- 指定 ASP.NET Core 应用监听的端口
- 发布 Angular 应用至生产环境
- 在 NHibernate 中使用 Snow Flake ID
- 在 Angular 应用中创建包含组件
- PostgreSQL 数据库中的窗口函数
- 代码整洁的 JavaScript
- Script 标记的 defer 和 async 属性说明
- 百行代码轻松爬取视频
- WebLogic coherence UniversalExtractor 反序列化 (CVE-2020-14645) 漏洞分析
- equals和hashCode你学会了么?
- 15 张精美动图全面讲解 CORS
- Rasa X 安装之Docker Compose 模式