1、什么是bitmap?
bitmap也叫位圖,也就是用一個bit位來表示一個東西的狀態,我們都知道bit位是二進制,所以只有兩種狀態,0和1。
2、為什么要有bitmap?
bitmap的出現就是為了大數據量而來的,但是前提是統計的這個大數據量每個的狀態只能有兩種,因為每一個bit位只能表示兩種狀態。
下面我們直接以一個統計億級用戶活動的狀態來說明吧。
3、案例說明 3.1、案例描述
如果有一個上億用戶的系統,需要我們去統計每一天的用戶登錄情況,我們應該如何去解決?
前提條件:設置在9月19號有下標為100、101、102、103四個用戶都登錄了系統
設置在9月20號有下標為100、101、102三個用戶都登錄了系統
提出問題:
1、取出9月19號登錄系統的有多少人?
答:直接獲取即可。
2、取出9月19號和9月20號連續登錄系統的有多少人?
答:兩天的數據取&運算。
3、取出9月19號與9月20號任意一天登錄的有多少人?
答:兩天的數據取|運算。
3.2、解決方案
3.2.1、解決方案1—使用傳統數據庫解決
如果我們需要使用傳統的數據庫去統計的話,我么需要創建一張表,然后某個用戶登錄了,我們就去在表里面插上一條記錄,登記用戶的id,用戶登錄的時間等等,但是這樣出現的問題就是,每一天的數據量都很大,我們在統計日活時,效率就很低,所以這種解決方案是不能被考慮的。
3.2.2、解決方案2—使用bitmap解決
既然用戶登錄只有兩種狀態,那么,我們就可以用bitmap
比如0表示未登錄,1表示登錄
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
// 設置在9月19號有下標為100、101、102、103四個用戶都登錄了系統 start 127.0.0.1:6379> setbit login_09_19 100 1 (integer) 0 127.0.0.1:6379> setbit login_09_19 101 1 (integer) 0 127.0.0.1:6379> setbit login_09_19 102 1 (integer) 0 127.0.0.1:6379> setbit login_09_19 103 1 (integer) 0 // 設置在9月19號有下標為100、101、102、103四個用戶都登錄了系統 end // 設置在9月20號有下標為100、101、102三個用戶都登錄了系統 start 127.0.0.1:6379> setbit login_09_20 100 1 (integer) 0 127.0.0.1:6379> setbit login_09_20 101 1 (integer) 0 127.0.0.1:6379> setbit login_09_20 102 1 (integer) 0 // 設置在9月20號有下標為100、101、102三個用戶都登錄了系統 end // 取出9月19號登錄系統的有多少人? start 127.0.0.1:6379> bitcount login_09_19 (integer) 4 // 取出9月19號登錄系統的有多少人? end // 取出9月19號和9月20號連續登錄系統的有多少人?start 127.0.0.1:6379> bitop and login_in_09_19_20:and login_09_19 login_09_20 (integer) 13 127.0.0.1:6379> bitcount login_in_09_19_20:and (integer) 3 // 取出9月19號和9月20號連續登錄系統的有多少人?end // 取出9月19號與9月20號任意一天登錄的有多少人?start 127.0.0.1:6379> bitop or login_in_09_19_20:or login_09_19 login_09_20 (integer) 13 127.0.0.1:6379> bitcount login_in_09_19_20:or (integer) 4 // 取出9月19號與9月20號任意一天登錄的有多少人?end |
到此這篇關于redis中的bitmap詳解的文章就介紹到這了,更多相關redis中的bitmap內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://blog.csdn.net/qq_41931364/article/details/120926014