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)驗
- type = string,BitMap 是 sting 類型,最大 512 MB。
- 注意 setbit 時的偏移量,可能有較大耗時
- 位圖不是絕對好。