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,不然須要維護一個非登錄用戶的映射,有額外的開銷。
缺點:若是用戶很是的稀疏,那麼佔用的內存可能比方法一更大。