天天看點

Redis:Bitmaps使用場景和常用指令

Bitmaps介紹

  • Redis提供的Bitmaps這個“資料結構”可以實作對位的操作。Bitmaps本身不是一種資料結構,實際上就是字元串,但是它可以對字元串的位進行操作。
  • 可以把Bitmaps想象成一個以位為機關數組,數組中的每個單元隻能存0或者1,數組的下标在bitmaps中叫做偏移量。
  • 單個bitmaps的最大長度是512MB,即2^32個比特位。
  • bitmaps的最大優勢是節省存儲空間。例如,在一個以自增id代表不同使用者的系統中,我們隻需要512MB空間就可以記錄40億使用者的某個單一資訊(比如,使用者是否希望接收新聞郵件)。
  • 有兩種類型的位操作:一類是對特定bit位的操作,比如設定/擷取某個特定比特位的值。另一類是批量bit位操作,例如在給定範圍内統計為1的比特位個數。
  • Bitmap是一串連續的2進制數字(0或1),每一位所在的位置為偏移(offset),在bitmap上可執行AND,OR,XOR以及其它位操作。

Bitmaps使用場景

  1. 各種實時分析(Real time analytics of all kinds)。

  2. 存儲與對象ID關聯的布爾資訊,要求高效且高性能(Storing space efficient but high performance boolean information associated with object IDs.)。

  • 例如你想知道自己網站使用者的最長連續通路天數。從0開始計數,每當有使用者通路時,使用setbit設定一個bit位,bit位的index可以這樣生成:(目前unix時間戳-計數開始時的時間戳)/(3600*24)。
  • 通過這種方法,你可以擷取每個使用者的每日來訪記錄。使用bitcount可以很容易的統計出某個特定使用者的來訪天數。使用幾個bitpos指令,或者直接擷取并分析對應的位圖,就可以很容易的算出最長連續通路天數。
  • bitmaps通常被分割成多個key,以免單個key中存放的資料過大。有一個分割key的小技巧:每個key存放M個bit位,key以”比特數(bit-number)/M”命名。第N個bit位,對應key中的位置用”比特數(bit-number)模M”獲得。
  • 假設我們每個key隻存儲100位,現在有一個id為8303的使用者來通路。那麼這個使用者對應的key應該是83(8303/100),在key:83中,與之對應的位置應該是3(8303 mod 100)。使用如下指令記錄該使用者通路:
setbit 83 3 1      
Redis:Bitmaps使用場景和常用指令

Bitmaps常用指令

1.設定值

指令:setbit key offset value      
Redis:Bitmaps使用場景和常用指令

setbit指令接收兩個參數,

  • 第一個參數表示你要操作的是第幾個bit位,第二個參數表示你要将這個位設為何值,可選值隻有0,1兩個。

  • 如果所操作的bit位超過了目前字串的長度,reids會自動增大字串長度。

2 擷取值

指令:getbit key offset      
Redis:Bitmaps使用場景和常用指令

getbit隻是傳回特定bit位的值。如果試圖擷取的bit位在目前字串長度範圍外,該指令傳回0。

3 擷取Bitmaps指定範圍值為1的個數

指令:bitcount key [start] [end]      
Redis:Bitmaps使用場景和常用指令

4 Bitmaps間的運算

  • bitop :對兩個不同字串進行位運算。可進行的運算有AND, OR, XOR以及NOT

4 .1 計算Bitmaps的交集的數量

指令:bitop and destkey key[key…]

傳回:儲存到 destkey 的字元串(1字元等于8位)的長度,和輸入 key 中最長的字元串長度相等。

4 .2 計算Bitmaps的并集的數量

指令:bitop or destkey key[key…]

傳回:儲存到 destkey 的字元串(1字元等于8位)的長度,和輸入 key 中最長的字元串長度相等。

4 .3  計算Bitmaps的非集的數量

指令:bitop not destkey key

傳回:儲存到 destkey 的字元串(1字元等于8位)的長度,和輸入 key 中最長的字元串長度相等。

4 .4  計算Bitmaps的異或集的數量

指令:bitop xor destkey key[key..]

傳回:儲存到 destkey 的字元串(1字元等于8位)的長度,和輸入 key 中最長的字元串長度相等。

5 計算Bitmaps中第一個值為targetBit的偏移量

  • bitpos : 查找第一個值為0/1的比特位的位置

指令:bitpos key targetBit [start][end]

傳回:第一個值為的偏移量

參考來源:

https://redis.io/topics/data-types-intro#bitmaps

繼續閱讀