久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

redis如何通過位圖法記錄在線用戶的狀態

167次閱讀
沒有評論

共計 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 如何通過位圖法記錄在線用戶的狀態”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-04發表,共計1909字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 南昌县| 嘉黎县| 无锡市| 铜梁县| 新宾| 长丰县| 长海县| 屏东市| 遵化市| 稻城县| 宜都市| 鞍山市| 武宣县| 辉县市| 葫芦岛市| 育儿| 新野县| 屯门区| 靖宇县| 绥宁县| 历史| 东丽区| 多伦县| 南乐县| 太湖县| 孝感市| 怀集县| 岐山县| 西和县| 兴海县| 揭东县| 绥化市| 鹤岗市| 陈巴尔虎旗| 甘洛县| 南雄市| 平泉县| 新宁县| 拜城县| 增城市| 天峻县|