[toc]
一、Bitmaps(位图)
Bitmaps 并不是理论的数据类型,而是定义在 String 类型上的一个面向字节操作的汇合。因为字符串是二进制平安的块,他们的最大长度是 512M,最适宜设置成 2^32 个不同字节。
Bitmaps 的最大劣势之一在存储信息时极其节约空间。例如,在一个以增量用户 ID 来标识不同用户的零碎中,记录用户的四十亿的一个独自 bit 信息(例如,要晓得用户是否想要接管最新的来信)仅仅应用 512M 内存。
1. getbit key offset
获取位图指定索引的值
127.0.0.1:6379> set bitmap big
OK
127.0.0.1:6379> getbit bitmap 0
(integer) 0
127.0.0.1:6379> getbit bitmap 1
(integer) 1
127.0.0.1:6379> getbit bitmap 2
(integer) 1
127.0.0.1:6379>
2. setbit key offset value
给位图指定索引设置值,返回该索引地位的原始值
127.0.0.1:6379> setbit bitmap 7 1
(integer) 0
127.0.0.1:6379> get bitmap
"cig"
127.0.0.1:6379>
3. bitcount key [start end]
获取位图指定范畴(start 到 end,单位为字节,如果不指定就是获取全副)位值为 1 的个数。
127.0.0.1:6379> bitcount bitmap
(integer) 13
127.0.0.1:6379> setbit bitmap 8 1
(integer) 0
127.0.0.1:6379> bitcount bitmap
(integer) 14
127.0.0.1:6379>
4. bitop and|or|not|xor destkey key [key…]
做多个 bitmap 的 and(交加)、or(并集)、not(非)、xor(异或)操作并将后果保留到 destkey 中。
127.0.0.1:6379> set hello good
OK
127.0.0.1:6379> set world good
OK
127.0.0.1:6379> bitop and hello_world hello world
(integer) 4
127.0.0.1:6379> get hello_world
"good"
127.0.0.1:6379> bitop or hello_world hello world
(integer) 4
127.0.0.1:6379> get hello_world
"good"
127.0.0.1:6379> bitop not hello_world hello
(integer) 4
127.0.0.1:6379> get hello_world
"\x98\x90\x90\x9b"
127.0.0.1:6379> bitop xor hello_world hello world
(integer) 4
127.0.0.1:6379> get hello_world
"\x00\x00\x00\x00"
127.0.0.1:6379>
5. bitpos key targetBit [start] [end](起始版本:2.8.7)
计算位图指定范畴(start 到 end,单位为字节,如果不指定就是获取全副)第一个偏移量对应的值等于 targetBit 的地位。
127.0.0.1:6379> set hello big
OK
127.0.0.1:6379> bitpos hello 1
(integer) 1
127.0.0.1:6379> bitpos hello 0
(integer) 0
127.0.0.1:6379> bitpos hello 1 2 2
(integer) 17
127.0.0.1:6379> bitpos hello 1 2 3
(integer) 17
127.0.0.1:6379> bitpos hello 0 2 3
(integer) 16
127.0.0.1:6379> bitpos hello 0 0 3
(integer) 0
127.0.0.1:6379> bitpos hello 1 0 3
(integer) 1
实战利用
独立用户拜访统计
- 应用 set 和 Bitmap(前提是用户的 ID 必须是整型)
- 1 亿用户,五千万独立
数据类型 | 每个 userId 占用空间 | 须要存储的用户量 | 内存应用总量 |
---|---|---|---|
set | 32 位 (假如 userId 用的是 integer) | 50,000,000 | 32 位 *50,000,000=200MB |
Bitmap | 1 位 | 100,000,000 | 1 位 *100,000,000=12.5MB |
- 若只有 10 万独立用户
数据类型 | 每个 userId 占用空间 | 须要存储的用户量 | 内存应用总量 |
---|---|---|---|
set | 32 位 (假如 userId 用的是整型) | 100,000 | 32 位 *100,000=4MB |
Bitmap | 1 位 | 100,000,000 | 1 位 *100,000,000=12.5MB |