“ 點選關注Coding小暮,擷取更多優質内容哦”
redis節衣縮食-BitMaps位圖
使用場景
資料量龐大,且資料内容單一。
在我們平時開發中,會有以下場景:
- 上億使用者的某一狀态,将每一個使用者的id對應BitMaps的一個下标,就可以擷取對應的狀态,比如說發郵件,記錄使用者簽到資料等...
- 統計某一資源每日通路量,可以每天定時生成一個BitMaps,當使用者通路了這個資源的時候,可以在BitMaps中把這個使用者的位置下标設定為1
BitMaps原理
BitMaps事實上就是一個字元串,它實作了對字元串的位操作,也就是byte數組(如下圖)。
數組中的每個單元隻能存儲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代碼
老夫準備了一下java學習資料,就在我的公衆号裡
。少俠可以關注我的公衆号在底部點選學習資料便可以免費擷取了。祝少俠早日練就一身本領,行俠仗義、前程似錦。