文章目录

  • 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位图场景详解相关推荐

  1. Redis三种特殊数据类型(Geospatial地理位置详解,Hyperloglog基数统计,Bitmap位图场景详解)

    学习总结,转自[狂神说Java]Redis最新超详细版教程通俗易懂_哔哩哔哩_bilibili 1.Geospatial 地理位置 Geospatial : 使用场景 :朋友的定位,方圆几公里得人(附 ...

  2. 七天玩转Redis | Day3、Redis地理位置、基数统计、位图场景使用详解

    号外号外

  3. racle B-Tree和Bitmap索引对比详解

    http://space.itpub.net/13062352/viewspace-614553 oracle B-Tree和Bitmap索引对比详解 B树索引是所有大型关系数据库毕用的技术,也是or ...

  4. 转:修改ETM,用Ogre实现《天龙八部》地形与部分场景详解

    本文主要讲的是<天龙八部>游戏的地形和一部分场景的具体实现,使用C++, Ogre1.6,我摸索了段时间,可能方法用的并不是最好的,但好歹实现了.文章可能讲得有点罗嗦,很多简单的东西都讲了 ...

  5. Redis入门 - 数据类型:5种基础数据类型详解

    Redis所有的key(键)都是字符串.我们在谈基础数据结构时,讨论的是存储值的数据类型,主要包括常见的5种数据类型,分别是:String.List.Set.Zset.Hash Redis入门 - 数 ...

  6. 安卓判断服务器返回的状态码,关于服务器返回的十四种常见HTTP状态码详解

    原标题:关于服务器返回的十四种常见HTTP状态码详解 HTTP状态码 状态码是由3位数字和原因短语组成的(比如最常见的:200 OK),其中第一位数字表示响应类别,响应类别从1到5分为五种 add:其 ...

  7. 【正点原子Linux连载】第三十五章 Linux内核顶层Makefile详解 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  8. 深度学习之图像分类(十九)-- Bottleneck Transformer(BoTNet)网络详解

    深度学习之图像分类(十九)Bottleneck Transformer(BoTNet)网络详解 目录 深度学习之图像分类(十九)Bottleneck Transformer(BoTNet)网络详解 1 ...

  9. 十大经典排序算法-快速排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

最新文章

  1. weblogic集群的资料
  2. Oracle内部错误:ORA-00600:[4097]一例
  3. python数据库有什么特点_python进阶十——mysql初识
  4. oracle--rowid
  5. ES6-7 - 箭头函数的实质、箭头函数的使用场景
  6. 算法竞赛入门经典 第七章 总结
  7. python的map函数求取每个元素的平方根_python的map函数的使用方法详解以及使用案例(处理每个元素的自增、自减、平方等)......
  8. 新技术刚测试就被全行业禁用,谷歌“杀死”Cookies真能重写规则吗?
  9. 推荐算法在招聘商业化场景中的应用实践
  10. win10下装黑苹果双系统_高手拆换GPD P2 Max无线模块,实现完美黑苹果
  11. 计算机应该玩什么游戏,电脑玩游戏主要靠什么配置
  12. ggplot2颜色设置
  13. vasp 模拟退火_【转】vasp的分子动力学模拟 - 第一原理 - 小木虫 - 学术 科研 互动社区...
  14. python 与 selenium
  15. 反向传播算法推导、激活函数、梯度消失与爆炸
  16. 捷联惯导中的姿态更新
  17. c++ cheat sheet
  18. 隐藏自己是爬虫装作客户爬取豆瓣网
  19. 洛谷 P1772 [ZJOI2006]物流运输
  20. Unicode码转UTF8

热门文章

  1. win10系统下配置maven环境
  2. b站黑马程序员python基础学习
  3. 疯狂Java讲义(九)
  4. x-windows -- 笔记
  5. 【面经——广州道一云+笔试+一二三面+HR面+offer】
  6. 移植一个抖音贴纸组件到Flutter
  7. 手机运行慢可以刷机吗_安卓手机反应慢怎么处理刷机有用吗(一个“动作”就能轻松解决,比新买的速度还快)...
  8. 优信二手车数据可视化
  9. chart.js-一款轻巧实用的可视化图表工具
  10. 【可达编程】最高的分数