之前介紹了基本數據類型及其數據結構,這篇文章主要介紹一下一種應用於特殊場景的對象: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。
另外一方面,輸入只能是整形。如果是字符串類型的,就沒法使用這個數據結構了。