Redis之BitMap

之前介紹了基本數據類型及其數據結構,這篇文章主要介紹一下一種應用於特殊場景的對象:BitMap。

首先思考一下這個應用場景應該怎麼解決:

  • 今天有哪些用戶登錄了?

如果不使用redis,常見的解決方案就是建一個日誌表,然後記錄對應的記錄,然後通過SQL將記錄查詢出來,這樣子的解決方案不是不可以,而是這樣子的效率很低,尤其隨着日誌越來越多的時候,統計分析起來會很慢。

什麼是BitMap

BitMap其實是一個數據結構,它是利用了位運算的高性能,來存儲和計算一些信息。接下來我們來介紹一下BitMap的原理。

BitMap其實是一個數據結構,它是利用了位運算的高性能,來存儲和計算一些信息。BitMap是基於bit位的位置來記錄信息的。比如我們現在有一個8位的BitMap。最開始時,所有位上都是0。

0, 0, 0, 0, 0, 0, 0, 0

那麼我們上面的應用場景可是這樣子實現:假設今天有id爲1、2、4、7這四個用戶登錄了我們的系統,我們想要把這個登錄信息記錄下來,就只需要在相應的位置標記爲1就行了:

1, 1, 0, 1, 0, 0, 1, 0

這個時候,你想知道id爲7的用戶今天是否登錄過系統,就只需要去看這個BitMap裏面第7位是不是1就可以了。

而且,可以利用位運算的特性,來快速實現統計、並集、交集等操作。

登陸過系統A的人有:1, 2, 4, 7:

1, 1, 0, 1, 0, 0, 1, 0

登陸過系統B的人有:1, 3, 4, 8:

1, 0, 1, 1, 0, 0, 0, 1

同時登陸過系統A和B的人有:

1, 1, 0, 1, 0, 0, 1, 0

&

1, 0, 1, 1, 0, 0, 0, 1

=

1, 0, 0, 1, 0, 0, 0, 0

得到同時登陸過系統A和B的人有:1, 4

Redis提供了bitmaps對象。它在某些場景下可以節省空間,並顯著提升性能。但如果輸入比較稀疏(比如網站註冊用戶有1億,但每天只有10萬用戶登錄),那還不如使用set。

另外一方面,輸入只能是整形。如果是字符串類型的,就沒法使用這個數據結構了。

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