做电影网站违法吗,莱芜 网站,温州快速网站推广公司,商标申请目录
BitMap
常用命令
应用场景
日活统计
用户签到
HyperLogLog
什么是基数?
常用命令
应用场景 BitMap 问: 有10亿个不重复的无序的正数#xff0c;如果快速排序#xff1f; 这看上去很简单#xff0c;就是一个排序而已#xff0c;但是大部分排序算…目录
BitMap
常用命令
应用场景
日活统计
用户签到
HyperLogLog
什么是基数?
常用命令
应用场景 BitMap 问: 有10亿个不重复的无序的正数如果快速排序 这看上去很简单就是一个排序而已但是大部分排序算法都需要把数据放到内存里面操作这10亿个数字得占用多少内存
在大部分编程语言里面int类型一般的都是占4个byte也是32位不管这个数字是1 或者是 21亿都得占32位所以如果现在有10亿数字需要存放在内存里面需要多少内存呢
以Java为例1000000000 * 4 / 1024 / 1024 3814.69MB大概需要3814.69MB内存
假如有 13725 这5个数字需要存放正常情况下你需要5*420byte但bitmap只需要1byte即桶排的思想。
setbit的大小在0到2的32次方最大使用512M内存之间即0~429496729642亿之间。
常用命令
bitmap主要就三个操作命令
setbit设置标记 getbit即 getbit key index 如果返回1表示存在否则不存在 bitcount即 bitcount key 统计和
应用场景
日活统计
统计应用或网站的日活这个属于比较常见的case了如果是用redis来做这个事情首先我们最容易想到的是Hash结构存储如下
日期key如“2024-03-17”userIdfield如“134”truevalue判断日活则是统计map的元素个数
以上设计其实没什么问题但如果日活量很高的话会造成大Key问题这里Value会很大我们看一下bitmap可以怎么做
setbit 日期 uesrId 1 bitcount 日期
简单对比一下上面两种方案
当数据量小时且userid分布不均匀小的为个位数大的几千万上亿这种使用bitmap就有点亏了因为userId作为index那么bitmap的长度就需要能容纳最大的userId但是实际日活又很小说明bitmap中间有大量的空白数据。
反之当数据量很大时比如百万/千万userId是连续递增的场景下bitmap的优势有两点
存储开销小统计总数快
用户签到
setbit 用户id年月 dayofmonth 1 bitcount 用户id年月
HyperLogLog
HyperLogLog是用来做基数统计的算法不是集合不会保存元数据只记录数量而不是数值。HyperLogLog的优点是在输入元素的数量或者体积非常非常大时计算基数所需的空间总是固定的、并且是很小的。在 Redis 里面每个 HyperLogLog 键只需要花费 12 KB 内存就可以计算接近 2^64 个不同元素的基数。这和计算基数时元素越多耗费内存就越多的集合形成鲜明对比。基数估计的结果是一个带有 0.81% 标准错误standard error的近似值。是可接受的范围。
什么是基数?
比如数据集(1357578} 那么这个数据集的基数集为{135 78}基数(不重复元素)为5。基数估计就是在误差可接受的范围内快速计算基数。
常用命令
PFADD key element [element ...]添加指定元素到 HyperLogLog 中PFCOUNT key [key ...]返回给定 HyperLogLog 的基数估算值PFMERGE destkey sourcekey [sourcekey ...〕将多个 HyperLogLog 合并为一个 HyperLogLog
应用场景
说明有局限性就是只能统计基数数量而没办法去知道具体的内容是什么
一般使用
统计注册 IP 数统计每日访问 IP 数统计页面实时 UV 数统计在线用户数统计用户每天搜索不同词条的个数