Redis的bitmap的應用例子

2021-10-23 16:22:14 字數 1615 閱讀 5738

上篇部落格介紹了redis14個指令組中的strings組中的所有指令,其中有很多關於bitmap的指令。bitmap的使用可以大大減少記憶體的使用,而且計算機對二進位制的操作成本非常的低。下面舉幾個例子,來具體說明一下bitmap的幾個應用場景。

問題一:在乙個商戶系統中,擁有5千萬的使用者,需要統計一下在連續的幾天內的活躍使用者數(即登入的使用者數量),該如何做?

我這裡為了圖省事使用了bitfield指令,使用bitcount檢視bit位為1的數量確實為5,說明了在20201111這一天有五個使用者登入了系統。

再比如 11月12號有3個使用者登入分別為:2、3、9,然後11月13號有7個使用者分別為1,2,3,4,7,9,10。

通過bitcount可以輕鬆的統計每一天的使用者登入情況,但是如果要統計這三天的活躍使用者數,並不是簡單的將這三天的使用者登入情況求加和,因為使用者2在第二天和第三天都登陸了,但是只能算一次,所以可以使用bitop or 對這三天的value做或運算,

通過bitcount distkey 看到distkey的bit位為1的數量為8,所以這三天的使用者活躍量為8。

再算一下對於5千萬使用者所佔的位元組數,因為每個使用者需要乙個bit位,所以無論活躍使用者量為多少,都需要5千萬個bit位所以大約為7mb。可見方案二比方案一要好的多。

問題二:還是在上面的商戶系統中,如何統計使用者一年的登入天數?

方案:可以使用bitmap,將上面的方案二做乙個變形,讓使用者id作為key,日期作為偏移量。如果使用者在某一天登入了則將該日期的bit位置為1。

在軟體開發過程中經常會判斷乙個集合中是否會存在某個元素,一般我們使用雜湊表來儲存資料,這樣通過hash演算法比較快速的判斷元素是否存在。但當有海量的資料時,雜湊表的弊端就體現出來了,太占用記憶體空間。比如:乙個商戶系統有1億的使用者,每個使用者都用自己的郵箱註冊且郵箱不能重複,當有新的使用者註冊時,如何判斷該使用者輸入的郵箱是否在系統中存在?

對於乙個新的郵箱a可以通過k個對映函式算出其在bit陣列中對應的幾個位置,只要有至少乙個bit位為0則說明,這個郵箱a肯定不在集合中。這種方式具有節省空間,效率快的實現簡單的優點。缺點也很明顯,如果郵箱b對映的幾個bit位正好被其他幾個郵箱都對映到了,但是b又沒有存在系統中就存在誤判情況,即當布隆過濾器說他不在集合中時那他一定不存在,當布隆過濾器說他在集合中時,他有機率不存在系統中。第二個缺點是不能刪除元素。當刪除元素時需要把其對映到的bit位都置為0,但是這些bit位可能會有其他元素的對映點,導致不能直接置為0.所以不能刪除元素。

redis的bitmap高度契合布隆過濾器的資料結構,所以redis提供了redisbloom的擴充套件module。

Redis的bitmap簽到應用

redis中位圖 bitmap 是由多個二進位制組成的陣列,陣列中的每個二進位制都有與之對應的偏移量 也稱索引 使用者通過偏移量可以對位圖中指定的乙個或多個二進位制進行操作。計算公式 offset 8 1024 1024 mb 儲存1千萬標記資訊,記憶體1.2mb的樣子,是不是很小。在時間開發中,我...

Redis中bitmap的妙用

在redis中我們經常用到set,get等命令,細心的你有沒有發現,還有幾個相似的命令叫setbit,getbit,它們是用來幹嘛的?就是通過乙個bit位來表示某個元素對應的值或者狀態,其中的key就是對應元素本身。我們知道8個bit可以組成乙個byte,所以bitmap本身會極大的節省儲存空間。r...

Redis中bitmap的妙用

23k 次閱讀 讀完需要 12 分鐘 在redis中我們經常用到set,get等命令,細心的你有沒有發現,還有幾個相似的命令叫setbit,getbit,它們是用來幹嘛的?就是通過乙個bit位來表示某個元素對應的值或者狀態,其中的key就是對應元素本身。我們知道8個bit可以組成乙個byte,所以b...