Bitmap 和 HyperLogLog

Bitmap

  1. 以二进制的数组存储(所有的数据都表示为 0 或 1,默认是0)
  2. 按bi位(bit)为单位参数,计算机是以字节(Byte)来计算容量的,一个字节等于8个位(1Byte=8bit)
  3. String 实现,所以最大支持 512M,二进制的数组容量上限是 512 * 1024 * 1024 * 8
  4. redis 查询结果是以整数返回的不是二进制,如果需要要在客户端中转型查看效果更好
  5. 适合大量数据,且只能二选一的结果,比如打卡、签到等

常用命令

  • SETBIT key offset value:指定的二进制数组下标位置设置一个值,值只能是 0 或 1,如果存在会覆盖
  • GETBIT key offset:获取指定位置的值,返回二进制
  • BITCOUNT key [start end]:统计二进制数组中为 1 的数量
  • BITFIELD:多功能命令,可以实现设置、查询、自增等功能
    • 设置、自增用的比较少,对于设置 SETBIT 更方便
    • 主要用这个命令的查询功能,因为一次可以获取多个位置的值(GETBIT 只能获取一个位置)
    • 返回的式十进制不是二进制
# 设置第一个位为 1
127.0.0.1:0>SETBIT mybit 0 1
"0"

# 设置第四个位为 1
127.0.0.1:0>SETBIT mybit 3 1
"0"

# 获取第一个位的值(返回 1)
127.0.0.1:0>GETBIT mybit 0
"1"

# 获取第三个位置的值(没设置值,默认是 0)
127.0.0.1:0>GETBIT mybit 2
"0"

# 范围 [0 - 100] 有几个位置是 1(有两个)
127.0.0.1:0>BITCOUNT mybit 0 100
"2"

# 从第 0 位置开始,总共获取三个位,无符号(u表示无符号)
# 此时值是 1001000001000000,从 0 开始获取 3 位得到 100,100 对应的十进制是 4
127.0.0.1:0>BITFIELD mybit GET u3 0
1) "4"

因为计算机使用 Byte 字节来存储数据,1Byte=8bit,不满 8 位所以要补 0,所以 mybit 此时二进制数据为:10010000

如果再执行命令 SETBIT mybit 9 1 第 10 位为 1,显示为:1001000001000000

HyperLogLog

  1. HLL,派生于 LogLog 算法,用于估算大数据集中唯一元素数量的高效算法
  2. 一个 HLL 所占空间最大不会超过 16k,代价就是数据量大时不是特别精确,误差基本保证在 0.81% 内
  3. 适用于 UV,PV 这种场景(来一个用户尽管往里丢,这种访问量也不需要多么精确)

常用命令

  • PFADD key element1 [element2 ...]:添加元素到 HyperLogLog 中
  • PFCOUNT key:查看有多少个元素(数据量太大时不是特别精确)
  • PFMERGE destkey sourcekey [sourcekey...]:将多个 HyperLogLog 合并到一个 HyperLogLog 中
# 添加 1、2、3 到 hll1 中
127.0.0.1:0>PFADD hll1 1 2 3
"1"

# 添加 2、3、4 到 hll1 中
127.0.0.1:0>PFADD hll1 2 3 4
"1"

# 统计 hll1 中有几个元素(4个,因为 2、3 重复了)
127.0.0.1:0>PFCOUNT hll1
"4"

# 添加 1、2、5 到 hll2 中
127.0.0.1:0>PFADD hll2 1 2 5
"1"

# hll1 hll2 合并到 newhll 中
127.0.0.1:0>PFMERGE newhll hll1 hll2
"OK"

# newhll 中有 5 个元素
127.0.0.1:0>PFCOUNT newhll
"5"
posted @   CyrusHuang  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示