简介

单位**

中文名 中文简称 单位 换算
兆字节 MB 1
千字节 千字节 KB 1*1024
字节 字节 B 110241024
比特 b 110241024*8

位图(Bitmaps)中一个 bit 位代表一个元素对应的值或状态,值仅有:0或1。也就是说一个bit最多能存储的2个信息。

数据类型

位图不是数据类型,而是 string 类型中定义的一个面向”位”的操作。这意味着位图支持 string 类型的操作,如:setget

另外位图遵循 string 类型的最大使用内存限制(不超过 512MB)。

而位图一个值即为 1 b,即支持:512*1024*1024*8-1(即:2^32-1) 的数量。

string 与 bit 转换

a b c
0 1 1 0 0 0 0 1 0 1 1 0 0 0 1 0 0 1 1 0 0 0 1 1

如表格,字符串 abc 的 ASCII 码的二进制值。(具体参考对照表

Redis 的 string 可使用位方式进行写入和获取。

如:set tests asetbit tests1 1 1、setbit tests1 2 1、setbit tests1 7 1
最终 teststests1 的值均为 a

优势


位图最大的优势是:极大的节省内存空间(但并非绝对,详见下文)。**

命令

setbit key offset value

给位图指定索引设置值,其中值,仅支持 0 或 1。

当设置索引为100的值时候,100以内未设置的索引,默认值为0


官方警告说明:**

当在索引量较小的 key 中设置偏移量过大的索引时,会造成阻塞。

如:当前最大索引为10,当设置索引为2^10次方的值时,会阻塞。

官方参考数据:**

在一台2010 MacBook Pro上,offset为2^32-1(分配512MB)需要~300ms,offset为2^30-1(分配128MB)需要~80ms,offset为2^28-1(分配32MB)需要~30ms,offset为2^26-1(分配8MB)需要8ms。

getbit key offset

获取位图指定索引的值

bitcount key [start end]

获取位图指定索引范围,其中值为 1 的个数

范围为 start 到 end,单位为字节(非“位”);若范围不指定,则默认获取所有


bitop op destkey key [key...]

将多个位图(Bitmap)执行 and(交集)or(并集)not(非)xor(异或)操作并将结果保存在 destkey 中。

示例: bitop and new old1 old2old1old2 执行交集,并存入 new

bitpos key targetBit [start] [end]

计算位图指定范围,第一个偏移量对应的值等于 targetBit 的位置

范围为 start 到 end,单位为字节(非“位”);若范围不指定,则默认获取所有

业务场景

  • 用户签到
  • 独立用户身份统计:将用户 ID 作为索引量进行统计
  • 用户在线状态
  • 支持以用户ID的形式标记约40亿用户是否同意过协议

    Set 与 Bitmaps 对比

假设有 1 亿用户,5000W独立用户日活:

数据类型 每个userid占用空间 需要存储用户量 内存使用量(1天) 内存使用量(1月) 内存使用量(1年)
set 32位(假设使用整型) 5000W 32位*5000W = 200MB 6G 72G
Bitmaps 1位 1亿(以用户ID作为索引,按最大用户ID设定) 1位 * 1亿 = 12.5MB 375MB 4.5G

假设有 1 亿用户,10W独立用户日活:

数据类型 每个userid占用空间 需要存储用户量 内存使用量(1天)
set 32位(假设使用整型) 10W 32位*10W = 4MB
Bitmaps 1位 1亿(以用户ID作为索引,按最大用户ID设定) 1位 * 1亿 = 12.5MB

总结: