Redis學習筆記 - Bitmaps(位圖)

什麼是 Bitmaps

Bitmaps 並非實際的數據類型,而是定義在String類型上的一個面向字節操做的集合。由於字符串是二進制安全的塊,他們的最大長度是512M,最適合設置成2^32個不一樣字節。segmentfault

Bitmaps 的最大優點之一在存儲信息時極其節約空間。例如,在一個以增量用戶ID來標識不一樣用戶的系統中,記錄用戶的四十億的一個單獨bit信息(例如,要知道用戶是否想要接收最新的來信)僅僅使用512M內存。安全

經常使用命令

1. getbit key offset

  • 獲取位圖指定索引的值
127.0.0.1:6379> set hello big
OK
127.0.0.1:6379> getbit hello 0
(integer) 0
127.0.0.1:6379> getbit hello 1
(integer) 1
127.0.0.1:6379> getbit hello 2
(integer) 1

圖片描述

2. setbit key offset value

  • 給位圖指定索引設置值,返回該索引位置的原始值
127.0.0.1:6379> set hello big
OK
127.0.0.1:6379> getbit hello 7
(integer) 0
127.0.0.1:6379> setbit hello 7 1
(integer) 0
127.0.0.1:6379> get hello
"cig"

127.0.0.1:6379> setbit world 50 1
(integer) 0
127.0.0.1:6379> get world
"\x00\x00\x00\x00\x00\x00 "
127.0.0.1:6379> setbit world 50 0
(integer) 1
127.0.0.1:6379> get world
"\x00\x00\x00\x00\x00\x00\x00"

圖片描述

3. bitcount key [start end]

  • 獲取位圖指定範圍(start到end,單位爲字節,若是不指定就是獲取所有)位值爲1的個數。
127.0.0.1:6379> set hello big
OK
127.0.0.1:6379> bitcount hello
(integer) 12
127.0.0.1:6379> setbit hello 7 1
(integer) 0
127.0.0.1:6379> bitcount hello
(integer) 13

127.0.0.1:6379> bitcount hello 0 0
(integer) 4
127.0.0.1:6379> bitcount hello 0 1
(integer) 8
127.0.0.1:6379> bitcount hello 0 2
(integer) 13
127.0.0.1:6379> bitcount hello 1 1
(integer) 4
127.0.0.1:6379> bitcount hello 1 2
(integer) 9
127.0.0.1:6379> bitcount hello 2 2
(integer) 5

4. bitop and|or|not|xor destkey key [key...]

  • 作多個bitmap的and(交集)、or(並集)、not(非)、xor(異或)操做並將結果保存到destkey中。
127.0.0.1:6379> set hello big
OK
127.0.0.1:6379> set world big
OK
127.0.0.1:6379> bitop and destkey hello world
(integer) 3
127.0.0.1:6379> get destkey
"big"
127.0.0.1:6379> bitop or destkey hello world
(integer) 3
127.0.0.1:6379> get destkey
"big"
127.0.0.1:6379> bitop not destkey hello
(integer) 3
127.0.0.1:6379> get destkey
"\x9d\x96\x98"
127.0.0.1:6379> bitop xor destkey hello world
(integer) 3
127.0.0.1:6379> get destkey
"\x00\x00\x00"

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

實戰應用

獨立用戶訪問統計

  1. 使用 set 和 Bitmap (前提是用戶的ID必須是整型)
  2. 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
  1. 若只有10萬獨立用戶
數據類型 每一個userId佔用空間 須要存儲的用戶量 內存使用總量
set 32位(假設userId用的是整型) 100,000 32位*100,000=4MB
Bitmap 1位 100,000,000 1位*100,000,000=12.5MB

使用經驗

  1. string類型最大長度爲512M。
  2. 注意setbit時的偏移量,當偏移量很大時,可能會有較大耗時。
  3. 位圖不是絕對的好,有時可能更浪費空間。

相關內容:

Redis學習筆記 - 數據類型與API(1)Key
Redis學習筆記 - 數據類型與API(2)String
Redis學習筆記 - 數據類型與API(3)List
Redis學習筆記 - 數據類型與API(4)Set
Redis學習筆記 - 數據類型與API(5)Sorted Set
Redis學習筆記 - 數據類型與API(6)Hash
Redis學習筆記 - Slow Log 慢查詢日誌學習

相關文章
相關標籤/搜索