redis使用bit作只有兩種狀況的「狀態「統計(如是否在線的用戶統計)

1 記錄在線用戶數(活躍用戶)?redis

好比redis中鍵a的value數據的二進制碼是
0110 0110 0001內存

它總共有12位,在redis的位操做中,二進制中的第幾位稱爲offset。get

咱們能夠這樣將這個數據的第10位設置爲1:
setbit a 10 1it

這樣,原來的數據就變成了
0110 0110 0101二進制

若是key不存在,也會自動建立。方法

固然,若是某個位還不存在,redis也會自動填充。統計

能夠經過getbit獲取某個二進制位的值數據

getbit a 10 //獲取鍵a的值上第10位的值(0或1兩種狀態)查詢

這是所謂的位圖。di

那麼咱們考慮在redis中放一個key,經過這個key直接操做二進制位,redis中單個key的最大值是512M,能夠達到40多億bit,足夠不少業務的須要了。咱們以用戶id做爲offset,該offset的值做爲是否活躍的值便可達到咱們的目的。這樣只須要一個key就能解決對全部數據的查詢問題。假設咱們的id最大值是1億,那麼咱們須要一億個bit就好了,至關於只須要1億/(810241024)=11.9M內存。這裏你們瞭解下二進制就能理解。

//用戶id123456是活躍用戶
setbit a 123456 1
//用戶id234567不是活躍用戶
setbit a 234567 0

--------實際場景---------

若是須要統計天天用戶訪問量,以日期爲key,用戶id爲offset,訪問了之後設置爲1 。

如:setbit 20190506 123456 1  這條命令算做一個用戶訪問後加1;

使用BITCOUNT 20190506命令來得到key爲20190506時一共有多少個offset被設置爲1;

優勢:佔用內存更小,查詢方便,能夠指定查詢某個用戶,數據可能略有瑕疵,對於非登錄的用戶,可能不一樣的key映射到同一個id,不然須要維護一個非登錄用戶的映射,有額外的開銷。

缺點:若是用戶很是的稀疏,那麼佔用的內存可能比方法一更大。

相關文章
相關標籤/搜索