[toc]

一、Bitmaps(位图)

Bitmaps 并不是理论的数据类型,而是定义在String类型上的一个面向字节操作的汇合。因为字符串是二进制平安的块,他们的最大长度是512M,最适宜设置成2^32个不同字节。

Bitmaps 的最大劣势之一在存储信息时极其节约空间。例如,在一个以增量用户ID来标识不同用户的零碎中,记录用户的四十亿的一个独自bit信息(例如,要晓得用户是否想要接管最新的来信)仅仅应用512M内存。

1. getbit key offset

获取位图指定索引的值

127.0.0.1:6379> set bitmap bigOK127.0.0.1:6379> getbit bitmap 0(integer) 0127.0.0.1:6379> getbit bitmap 1(integer) 1127.0.0.1:6379> getbit bitmap 2(integer) 1127.0.0.1:6379>

2. setbit key offset value

给位图指定索引设置值,返回该索引地位的原始值

127.0.0.1:6379> setbit bitmap 7 1(integer) 0127.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) 13127.0.0.1:6379> setbit bitmap 8 1(integer) 0127.0.0.1:6379> bitcount bitmap(integer) 14127.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 goodOK127.0.0.1:6379> set world goodOK127.0.0.1:6379> bitop and hello_world hello world(integer) 4127.0.0.1:6379> get hello_world"good"127.0.0.1:6379> bitop or hello_world hello world(integer) 4127.0.0.1:6379> get hello_world"good"127.0.0.1:6379> bitop not hello_world hello(integer) 4127.0.0.1:6379> get hello_world"\x98\x90\x90\x9b"127.0.0.1:6379> bitop xor hello_world hello world(integer) 4127.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 bigOK127.0.0.1:6379> bitpos hello 1(integer) 1127.0.0.1:6379> bitpos hello 0(integer) 0127.0.0.1:6379> bitpos hello 1 2 2(integer) 17127.0.0.1:6379> bitpos hello 1 2 3(integer) 17127.0.0.1:6379> bitpos hello 0 2 3(integer) 16127.0.0.1:6379> bitpos hello 0 0 3(integer) 0127.0.0.1:6379> bitpos hello 1 0 3(integer) 1

实战利用

独立用户拜访统计

  1. 应用 set 和 Bitmap (前提是用户的ID必须是整型)
  2. 1亿用户,五千万独立
数据类型每个userId占用空间须要存储的用户量内存应用总量
set32位(假如userId用的是integer)50,000,00032位*50,000,000=200MB
Bitmap1位100,000,0001位*100,000,000=12.5MB
  1. 若只有10万独立用户
数据类型每个userId占用空间须要存储的用户量内存应用总量
set32位(假如userId用的是整型)100,00032位*100,000=4MB
Bitmap1位100,000,0001位*100,000,000=12.5MB