Redis(十)——HyperLogLog 基数统计和 Bitmap位图场景详解
文章目录
- Redis(十)——HyperLogLog 基数统计和 Bitmap位图场景详解
- 1、HyperLogLog 基数统计
- 2、Bitmap位图场景详解
Redis(十)——HyperLogLog 基数统计和 Bitmap位图场景详解
1、HyperLogLog 基数统计
什么是基数?
比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为5。 基数估计就是在误差可接受的范围内,快速计算基数。
Redis HyperLogLog
Redis 在 2.8.9 版本添加了 HyperLogLog 结构。
Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。
常用命令:
序号 | 命令及描述 |
---|---|
1 | [PFADD key element [element …]添加指定元素到 HyperLogLog 中。 |
2 | [PFCOUNT key [key …] 返回给定 HyperLogLog 的基数估算值。 |
3 | [PFMERGE destkey sourcekey [sourcekey …] 将多个 HyperLogLog 合并为一个 HyperLogLog |
使用实例:
#添加指定元素到 HyperLogLog 中
127.0.0.1:6379> pfadd key1 a b c d e f g h
(integer) 1
#返回给定 HyperLogLog 的基数估算值
127.0.0.1:6379> pfcount key1
(integer) 8
127.0.0.1:6379> pfadd key2 e f g h x w y x z
(integer) 1
127.0.0.1:6379> pfcount key2
(integer) 8
#将多个 HyperLogLog 合并为一个 HyperLogLog
127.0.0.1:6379> pfmerge key3 key1 key2
OK
127.0.0.1:6379> pfcount key3
(integer) 12
2、Bitmap位图场景详解
bitmap就是通过最小的单位bit来进行0或者1的设置,表示某个元素对应的值或者状态。一个bit的值,或者是0,或者是1;也就是说一个bit能存储的最多信息是2。
Redis从2.2.0版本开始新增了setbit
,getbit
,bitcount
等几个bitmap相关命令。虽然是新命令,但是并没有新增新的数据类型,因为setbit
等命令只不过是在set
上的扩展。
语法详解:
setbit key offset value
对key所存储的字符串值,设置或清除指定偏移量上的位(bit),如果不存在,就设置;如果已存在,就清除原有的,设置新的。
返回值为该位在setbit之前的值,value只能取0或1,offset(偏移量)从0开始,即使原位图只能10位,offset可以取1000
getbit key offset
对key所存储的字符串值,获取指定偏移量上的位(bit)
bitcount key [start end]
获取位图指定范围中位值为1的个数,如果不指定start与end,则取所有
使用场景1:统计一周打卡次数
0-6为周一到周末,1表示已打卡,0表示未打卡
#========================记录一周内的打卡情况========================
127.0.0.1:6379> setbit sign 0 1
(integer) 0
127.0.0.1:6379> setbit sign 1 1
(integer) 0
127.0.0.1:6379> setbit sign 2 0
(integer) 0
127.0.0.1:6379> setbit sign 3 0
(integer) 0
127.0.0.1:6379> setbit sign 4 1
(integer) 0
127.0.0.1:6379> setbit sign 5 1
(integer) 0
127.0.0.1:6379> setbit sign 6 0
(integer) 0
#========================查看具体某一天的打卡情况========================
127.0.0.1:6379> getbit sign 2
(integer) 0
#========================统计一周内打卡次数========================
127.0.0.1:6379> bitcount sign
(integer) 4
使用场景2:统计活跃用户
使用时间作为Key,然后用户ID为offset,如果当日活跃过就设置为1
#记录2021年08月12日用户的状态
127.0.0.1:6379> setbit 20210812 1 1
(integer) 0
127.0.0.1:6379> setbit 20210812 2 0
(integer) 0
127.0.0.1:6379> setbit 20210812 3 0
(integer) 0
#查看指定用户在2021年08月12日是否活跃
127.0.0.1:6379> getbit 20210812 2
(integer) 0
#查看在2021年08月12日活跃的用户数
127.0.0.1:6379> bitcount 20210812
(integer) 1
使用bitmap是一个节约空间效率又高的一种方法
Redis(十)——HyperLogLog 基数统计和 Bitmap位图场景详解相关推荐
- Redis三种特殊数据类型(Geospatial地理位置详解,Hyperloglog基数统计,Bitmap位图场景详解)
学习总结,转自[狂神说Java]Redis最新超详细版教程通俗易懂_哔哩哔哩_bilibili 1.Geospatial 地理位置 Geospatial : 使用场景 :朋友的定位,方圆几公里得人(附 ...
- 七天玩转Redis | Day3、Redis地理位置、基数统计、位图场景使用详解
号外号外
- racle B-Tree和Bitmap索引对比详解
http://space.itpub.net/13062352/viewspace-614553 oracle B-Tree和Bitmap索引对比详解 B树索引是所有大型关系数据库毕用的技术,也是or ...
- 转:修改ETM,用Ogre实现《天龙八部》地形与部分场景详解
本文主要讲的是<天龙八部>游戏的地形和一部分场景的具体实现,使用C++, Ogre1.6,我摸索了段时间,可能方法用的并不是最好的,但好歹实现了.文章可能讲得有点罗嗦,很多简单的东西都讲了 ...
- Redis入门 - 数据类型:5种基础数据类型详解
Redis所有的key(键)都是字符串.我们在谈基础数据结构时,讨论的是存储值的数据类型,主要包括常见的5种数据类型,分别是:String.List.Set.Zset.Hash Redis入门 - 数 ...
- 安卓判断服务器返回的状态码,关于服务器返回的十四种常见HTTP状态码详解
原标题:关于服务器返回的十四种常见HTTP状态码详解 HTTP状态码 状态码是由3位数字和原因短语组成的(比如最常见的:200 OK),其中第一位数字表示响应类别,响应类别从1到5分为五种 add:其 ...
- 【正点原子Linux连载】第三十五章 Linux内核顶层Makefile详解 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0
1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...
- 深度学习之图像分类(十九)-- Bottleneck Transformer(BoTNet)网络详解
深度学习之图像分类(十九)Bottleneck Transformer(BoTNet)网络详解 目录 深度学习之图像分类(十九)Bottleneck Transformer(BoTNet)网络详解 1 ...
- 十大经典排序算法-快速排序算法详解
十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...
最新文章
- weblogic集群的资料
- Oracle内部错误:ORA-00600:[4097]一例
- python数据库有什么特点_python进阶十——mysql初识
- oracle--rowid
- ES6-7 - 箭头函数的实质、箭头函数的使用场景
- 算法竞赛入门经典 第七章 总结
- python的map函数求取每个元素的平方根_python的map函数的使用方法详解以及使用案例(处理每个元素的自增、自减、平方等)......
- 新技术刚测试就被全行业禁用,谷歌“杀死”Cookies真能重写规则吗?
- 推荐算法在招聘商业化场景中的应用实践
- win10下装黑苹果双系统_高手拆换GPD P2 Max无线模块,实现完美黑苹果
- 计算机应该玩什么游戏,电脑玩游戏主要靠什么配置
- ggplot2颜色设置
- vasp 模拟退火_【转】vasp的分子动力学模拟 - 第一原理 - 小木虫 - 学术 科研 互动社区...
- python 与 selenium
- 反向传播算法推导、激活函数、梯度消失与爆炸
- 捷联惯导中的姿态更新
- c++ cheat sheet
- 隐藏自己是爬虫装作客户爬取豆瓣网
- 洛谷 P1772 [ZJOI2006]物流运输
- Unicode码转UTF8