简介
单位**
中文名 | 中文简称 | 单位 | 换算 |
---|---|---|---|
兆字节 | 兆 | MB | 1 |
千字节 | 千字节 | KB | 1*1024 |
字节 | 字节 | B | 110241024 |
位 | 比特 | b | 110241024*8 |
位图(Bitmaps)中一个 bit 位代表一个元素对应的值或状态,值仅有:0或1。也就是说一个bit最多能存储的2个信息。
数据类型
位图不是数据类型,而是 string
类型中定义的一个面向”位”的操作。这意味着位图支持 string
类型的操作,如:set
、get
。
另外位图遵循 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 a
与 setbit tests1 1 1、setbit tests1 2 1、setbit tests1 7 1
;
最终 tests
与 tests1
的值均为 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 old2
将 old1
和 old2
执行交集,并存入 new
中
bitpos key targetBit [start] [end]
计算位图指定范围,第一个偏移量对应的值等于 targetBit
的位置
范围为 start 到 end,单位为字节(非“位”);若范围不指定,则默认获取所有
业务场景
假设有 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 |
总结:
- Bitmaps 因数据类型为
string
,所以最大支持 512 MB 内存;如超出内存,可考虑使用多个 key; - 注意使用 Bitmaps 时的偏移量(索引),可能会阻塞 Redis;
-
扩展阅读
Redis中bitmap的妙用:https://www.cnblogs.com/wuhaidong/articles/10389484.html
- 官网 SETBIT 介绍:https://redis.io/commands/SETBIT
- 布隆过滤器:https://www.jianshu.com/p/2104d11ee0a2