redis 學(xué)習(xí)(13)-- BitMap

BitMap

什么是 BitMap

BitMap,即位圖,其實也就是 byte 數(shù)組,用二進(jìn)制表示,只有 0 和 1 兩個數(shù)字。

如圖所示:

重要 API

命令 含義
getbit key offset 對key所存儲的字符串值,獲取指定偏移量上的位(bit)
setbit key offset value 對key所存儲的字符串值,設(shè)置或清除指定偏移量上的位(bit)
1. 返回值為該位在setbit之前的值
2. value只能取0或1
3. offset從0開始,即使原位圖只能10位,offset可以取1000
bitcount key [start end] 獲取位圖指定范圍中位值為1的個數(shù)
如果不指定start與end,則取所有
bitop op destKey key1 [key2...] 做多個BitMap的and(交集)、or(并集)、not(非)、xor(異或)操作并將結(jié)果保存在destKey中
bitpos key tartgetBit [start end] 計算位圖指定范圍第一個偏移量對應(yīng)的的值等于targetBit的位置
1. 找不到返回-1
2. start與end沒有設(shè)置,則取全部
3. targetBit只能取0或者1

演示

應(yīng)用場景

統(tǒng)計每日用戶的登錄數(shù)。每一位標(biāo)識一個用戶ID,當(dāng)某個用戶訪問我們的網(wǎng)頁或執(zhí)行了某個操作,就在bitmap中把標(biāo)識此用戶的位設(shè)置為1。

這里做了一個 使用 set 和 BitMap 存儲的對比。

場景1:1 億用戶,5千萬獨立

數(shù)據(jù)類型 每個 userid 占用空間 需要存儲的用戶量 全部內(nèi)存量
set 32位(假設(shè)userid用的是整型,實際很多網(wǎng)站用的是長整型) 50,000,000 32位 * 50,000,000 = 200 MB
BitMap 1 位 100,000,000 1 位 * 100,000,000 = 12.5 MB
一天 一個月 一年
set 200M 6G 72G
BitMap 12.5M 375M 4.5G

場景2:只有 10 萬獨立用戶

數(shù)據(jù)類型 每個 userid 占用空間 需要存儲的用戶量 全部內(nèi)存量
set 32位(假設(shè)userid用的是整型,實際很多網(wǎng)站用的是長整型) 1,000,000 32位 * 1,000,000 = 4 MB
BitMap 1 位 100,000,000 1 位 * 100,000,000 = 12.5 MB

通過上面的對比,我們可以看到,如果獨立用戶數(shù)量很多,使用 BitMap 明顯更有優(yōu)勢,能節(jié)省大量的內(nèi)存。但如果獨立用戶數(shù)量較少,還是建議使用 set 存儲,BitMap 會產(chǎn)生多余的存儲開銷。

使用經(jīng)驗

  1. type = string,BitMap 是 sting 類型,最大 512 MB。
  2. 注意 setbit 時的偏移量,可能有較大耗時
  3. 位圖不是絕對好。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容