一、基礎知識
1、概念

說明:用String類型作為底層數據結構實現的一種統計二值狀態的數據類型
位圖(bitmap)本質是數組,它是基於String數據類型的按位的操作。該數組由多個二進制位組成,每個二進制位都對應一個偏移量(我們可以稱之為一個索引或者位格)。Bitmap支持的最大位數是2^32位,它可以極大的節約存儲空間,使用512M內存就可以存儲多大42.9億的字節信息(2^32 = 4294967296)
一句話總結:bitmap是由0和1狀態表現的二進制位的bit數組。常用於二值統計。
2、優缺點
優點
- 精確計算,結果准確,結果只有0/1。
- 億級數據的收集和統計,存的進+取得快+多統計。
- 節省存儲空間,統計一億位的Bitmap約占12MB的內存,內存開銷低,。(如果這些數據存在mysql中?)
缺點
- 數據量過大的場景,一億位的Bitmap約占12MB,十億就是120MB,百億就是1GB。
3、使用場景
(1)用於狀態統計:Y、N,類似AtomicBoolean。
(2)釘釘打卡上下班,簽到統計。
(3)日活統計。
(4)某用戶按照一年365天,哪幾天登陸過?哪幾天沒有登陸?全年中登錄的天數共計多少?
(5)電影、廣告是否被點擊播放過
二、常見命令
bitmap底層是String,可以用get命令得到二進制的ascii編碼

1、setbit
setbit key offset value
key——鍵
offset——偏移位(Bitmap的偏移位是從0開始算的)
value——值(只能是0和1)
例:
2022年1月18日簽到,setbit sign:userId:202201 18 1
2、getbit
getbit key offset
3、bitcount
bitcount key,用於統計全部鍵里面含有1的有多少個。
常見場景:統計簽到次數。

4、strlen
strlen key,用於統計字節長度。不是字符串長度而是占據幾個字節,超過8位后自己按照8位一組一byte再擴容。
例:

5、bitop
BITOP operation destkey key [key ...],對一個或多個 key 進行位元操作,並將結果保存到 destkey 上(destkey可自定義)。
常見場景:查詢連續簽到的用戶
operation 可以是 AND 、 OR 、 NOT 、 XOR 這四種操作中的任意一種:
- BITOP AND destkey key [key ...] ,對一個或多個 key 求邏輯並,並將結果保存到 destkey 。
- BITOP OR destkey key [key ...] ,對一個或多個 key 求邏輯或,並將結果保存到 destkey 。
- BITOP XOR destkey key [key ...] ,對一個或多個 key 求邏輯異或,並將結果保存到 destkey 。
- BITOP NOT destkey key ,對給定 key 求邏輯非,並將結果保存到 destkey
redis> SETBIT k1 0 1 # k1 = 1001 (integer) 0 redis> SETBIT k1 3 1 (integer) 0 redis> SETBIT k2 0 1 # k2 = 1011 (integer) 0 redis> SETBIT k2 1 1 (integer) 0 redis> SETBIT k2 3 1 (integer) 0 redis> BITOP AND and-result k1 k2 (integer) 1 redis> GETBIT and-result 0 # and-result = 1001 (integer) 1 redis> GETBIT and-result 1 (integer) 0 redis> GETBIT and-result 2 (integer) 0 redis> GETBIT and-result 3 (integer) 1
