三、Redis新類型之 bitmap


一、基礎知識

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM