共計 1909 個字符,預計需要花費 5 分鐘才能閱讀完成。
這篇文章給大家分享的是有關 redis 如何通過位圖法記錄在線用戶的狀態的內容。丸趣 TV 小編覺得挺實用的,因此分享給大家做個參考,一起跟隨丸趣 TV 小編過來看看吧。
前言
在進入今天的主題前,先簡單地解釋下 Redis 中的位圖到底是什么。Redis 官方文檔對于位圖的介紹如下:
位圖不是一個真實的數據類型,而是定義在字符串類型上的面向位的操作的集合。由于字符串類型是二進制安全的二進制大對象,并且最大長度是 512MB,適合于設置 2^32 個不同的位。
位操作分為兩組:常量時間單個位的操作,像設置一個位為 1 或者 0,或者獲取該位的值。對一組位的操作,例如計算指定范圍位的置位數量。
位圖的最大優勢是有時是一種非常顯著的節省空間來存儲信息的方式。例如,在一個系統中,不同用戶由遞增的用戶 ID 來表示,可以使用 512MB 的內存來表示 400 萬用戶的單個位信息(例如他們是否需要接收信件)。
簡而言之,位圖操作是用來操作比特位的,其優點是節省內存空間。為什么可以節省內存空間呢?假如我們需要存儲 100 萬個用戶的登錄狀態,使用位圖的話最少只需要 100 萬個比特位(比特位 1 表示登錄,比特位 0 表示未登錄)就可以存儲了,而如果以字符串的形式存儲,比如說以 userId 為 key,是否登錄(字符串“1”表示登錄,字符串“0”表示未登錄)為 value 進行存儲的話,就需要存儲 100 萬個字符串了,相比之下使用位圖存儲占用的空間要小得多,這就是位圖存儲的優勢。
這幾天在工作中,遇到一個 case,就是需要自己實現一個 IM 在線用戶狀態的記錄,當時查了很多中實現方式,今天來分享一下
主要思想
構造一個位圖,里面存的是二進制數據,如:1 0 1 0 1 0 1,通過修改 userId 對應位置上的 0 和 1 來修改用戶在線狀態,由于默認值為 0,所以 1 代表用戶處于在線狀態,0 代表用戶處于離線狀態,如圖:
構造了 Mon、Thus、Web 三個位圖
構造了 Mon、Thus、Web 三個位圖,對于 Mon 來說,userId= 1 的用戶處于在線狀態,userId= 2 的用戶處于離線狀態,userId= 3 的用戶處于在線狀態,當 userId=10 的用戶上線后,就把第 10 位上值變成 1
空間預估
二進制數據 1 位為 1bit
1 千兆字節 (gb)=8589934592 比特 (bit)
理論上 1G 的內存可以記錄 85 億多的用戶狀態,如果 userId 不連貫,有的 userId 位數超過 85 億位,可以使用一些算法、或者對 userId 按位分段來解決
使用命令
setbit key offset value 修改 key 中,第 offset 位的值為 value
Setbit
getbit key offset 獲取 key 中,第 offset 位上的 value
getbit
bitcount key 統計 key 中,1 的個數
bitcount
bitop op destKey key1 key2 ….. 其中 op 可以為 AND(于)、OR(或)、NOT(非)、XOR(異或)
命令的主要作用是,給 key1、key2.. 等,這種二進制數據,按位做邏輯運算,結果付到 destkey 中,沒有 setbit 的位置默認為 0
舉個栗子
構造了 Mon、Thus、Web 三個位圖,作為近三天登錄狀態的位圖
構造了 Mon、Thus、Web 三個位圖
第一天
userId=10000,userId=9999,userId=8888 的用戶登錄了
setbit mon 10000 1;
setbit mon 9999 1;
setbit mon 8888 1;
統計第一天在線用戶量
bitcount mon
有三個用戶登錄
第一天有三個用戶登錄
第二天
userId=9999,userId=7777 的用戶登錄了
setbit thus 9999 1;
setbit thus 7777 1;
獲取 userId=7777 用戶在線狀態
getbit thus 7777
7777 用戶處于登錄狀態
第三天
userId=9999,userId=6666 的用戶登錄了
setbit web 9999 1;
setbit web 6666 1;
獲取三天都登錄的用戶數
bitop and resultand mon thus web;
獲取三天都登錄的用戶數
獲取三天內登陸過的用戶數
bitop or resultor mon thus web;
獲取三天內登陸過的用戶數
redis 使用位圖法記錄在線用戶的狀態就為大家說到這里,歡迎大家來交流,指出文中一些說錯的地方,讓我加深認識。
感謝各位的閱讀!關于“redis 如何通過位圖法記錄在線用戶的狀態”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!