天天看點

redis擷取byte數組_redis節衣縮食BitMaps位圖redis節衣縮食-BitMaps位圖

“ 點選關注Coding小暮,擷取更多優質内容哦”

redis節衣縮食-BitMaps位圖

使用場景

資料量龐大,且資料内容單一。

在我們平時開發中,會有以下場景:

  1. 上億使用者的某一狀态,将每一個使用者的id對應BitMaps的一個下标,就可以擷取對應的狀态,比如說發郵件,記錄使用者簽到資料等...
  2. 統計某一資源每日通路量,可以每天定時生成一個BitMaps,當使用者通路了這個資源的時候,可以在BitMaps中把這個使用者的位置下标設定為1

BitMaps原理

BitMaps事實上就是一個字元串,它實作了對字元串的位操作,也就是byte數組(如下圖)。

redis擷取byte數組_redis節衣縮食BitMaps位圖redis節衣縮食-BitMaps位圖

數組中的每個單元隻能存儲0或者1,是以非常适合存儲Boolean值。數組的下标在BitMaps中叫偏移量。

我們可以使用getbit/setbit等将byte數組看成“位數組”來處理。可以使用BitMaps的指令直接去操作一個類型為String 的key。

redis中單個String最大長度是512M,這個長度限制也同樣适用于BitMaps,理論上這個長度可以存儲40億使用者資料。

常用方法

寫入

setbit key offset value

setbit指令接收兩個參數,

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

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

讀寫

getbit key offset

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

統計和查找

bitcount key [start] [end]

擷取Bitmaps指定範圍值為1的個數,可以用來統計使用者在一段時間内簽到的天數。

bitpos key val  [start] [end]

傳回字元串裡面第一個被設定為1或者0的bit位。val的值隻能是1或者0。[start] [end]是指定了一個範圍,例如

start=0

 并且 

end=2

是指前三個位元組範圍内查找

注意bitcount和bitpos時間複雜度是:O(N)

java代碼

redis擷取byte數組_redis節衣縮食BitMaps位圖redis節衣縮食-BitMaps位圖

      老夫準備了一下java學習資料,就在我的公衆号裡

redis擷取byte數組_redis節衣縮食BitMaps位圖redis節衣縮食-BitMaps位圖

。少俠可以關注我的公衆号在底部點選學習資料便可以免費擷取了。祝少俠早日練就一身本領,行俠仗義、前程似錦。

redis擷取byte數組_redis節衣縮食BitMaps位圖redis節衣縮食-BitMaps位圖
redis擷取byte數組_redis節衣縮食BitMaps位圖redis節衣縮食-BitMaps位圖