redis位圖(bitmap)常用命令的解析

描述

  bitmap是redis封裝的用於針對位(bit)的操作,其特點是計算效率高,佔用空間少,常被用來統計用戶簽到、登錄等場景

常用命令及解析

常用命令

setbit key offset value

  給key在指定位索引位置上(offset)設置一個value,因爲是bit所以value只能爲0或1;如setbit zhangsan 2 1表示在位索引的2號位設置爲1,對應的二進制位應該是0010 0000

getbit key offset

  獲取key在指定位索引位置上對應的二進制值,要麼是0要麼是1

bitcount key [start end]

  統計key在給定的字節索引範圍內1出現的次數;如bitcount zhangsan 1 2表示統計張三在字節所以1-2之間1出現的次數

bitpos key bit [start] [end]

  統計key對應的二進制串中指定的bit(1或0)在指定字節索引下標內第一次出現的位置,沒有出現返回-1;

bitop operation destkey key [key ...]

  將兩個或多個key的二進制位進行或、與的操作然後賦值給指定的新key(destkey);如bitop and k3 k1 k2表示將k1和k2按與操作後賦值給k3

解析

  針對上面的常用命令,如果是初識的話有可能會比較矇蔽,下面結合我畫的圖來進行解析;首先需要明確的一點是上文提到的offset(偏移量)指的是bit(位)的索引位置,一個字節等於8個bit,bit的索引下標從0開始;然後命令裏的start end這些表示的是字節索引位置,如[0,2]表示字節的0到2的區間,相當於3個字節對應bit位置的0-24,下面上圖:
image
針對上圖我們再跑一遍上面的常用命令進行解析:

setbit zhangsan 3 1 表示將bit下標爲3的位置設置爲1,二進制表示如下:0001 0000
getbit zhangsan 3 表示獲取bit下標爲3位置上的二進制值爲1,如果getbit zhangsan 2則值爲0
bitcount zhangsan 0 1 表示獲取字節下標0-1(相當於bit下標的0-15)之間位置內1出現的次數,這裏結果爲1
bitpos zhangsan 1 0 1 表示獲取字節下標0-1(相當於bit下標的0-15)之間位置內1第一次出現的次數,因爲上面設置了zhangsan對應的二進制爲0001 0000,所以這裏結果應爲3
bitop operation destkey key [key ...] 這是bitop前再設置一個key,setbit lisi 2 1,然後執行bitop or k3 zhangsan lisi,這時k3的值因爲zhangsan/lisi二進制or運算後的值,應爲0011 0000;

應用場景

統計不確定時間週期內用戶登錄情況

  比方說需要統計20220101-20220107區間內用戶登錄的次數

思路分析

  針對用戶量不是那麼多且登錄不頻繁的非互聯網型的應用,利用mysql維護一張用戶登錄的日誌表就能解決問題,但是假設用戶量過大且用戶登錄次數頻繁的情況下,mysql就並不是最優解了;這時可以結合使用bitmap來實現這一需求

實現

  在redis裏維護一個key爲用戶id的bitmap,用戶每次登錄時setbit userId offset 1;需要注意的是這裏的offset需要進行計算映射,將bit的下標與一年的365天對應上;統計的時候根據不同需求有好幾種實現;
1、bitcount userId 0 -1 統計用戶一年登錄的次數
2、根據具體查詢區間循環getbit userId offset;如查詢20220101-20220107區間內用戶登錄的次數則先找到20220101-10對應的偏移量接着循環getbit,判斷結果,如果是1則給登錄天數加1即可

統計某一特定時間內活躍用戶(登錄一次即算活躍)的數量

思路分析與實現

  將日期作爲key,offset映射成不同的用戶id,當不同的用戶登錄時setbit 20210101 offset,如:
setbit 20220101 0 1
setbit 20220102 1 1
setbit 20220102 0 1
setbit 20220102 2 1
以日期爲key,將用戶id與位索引提前做好映射,比方說0位表示張三1位表示李四2位表示王五,當張三登錄時在0位設置1,李四登錄在1位設置1,王五登錄在2位設置1,統計指定時間時將指定時間對應的key做bitop操作即可,如下:bitop or  k3 20220101 20220102 上面命令表示將20220101和02這兩個key做or操作,因爲二進制or操作是有1即是1,最後統計k3裏1出現的次數即得出20210101到02之間活躍用戶數爲3:bitcount k3 0 -1

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章