Redis中Bitmaps的使用(簽到功能的實現)

2021-09-05 08:50:14 字數 1982 閱讀 7586

bitmaps並不屬於redis中資料結構的一種,它的命令基於string操作,是setget等一系列字串操作的一種擴充套件,與其不同的是,它提供的是位級別的操作,從這個角度看,我們也可以把它當成是一種位陣列、位向量結構。當我們需要訪問一些boolean型別的資訊時,bitmap是乙個非常不錯的選擇,在節省記憶體的同時也擁有很好的訪問速度(getbit/setbit操作時間複雜度為o(1))。

setbit key offset value

設定或者清空key的value(字串)在offset處的bit值。當key不存在的時候,將新建字串value。引數offset需要大於等於0,並且小於232(限制bitmap大小為512mb)。當key對應的字串增大的時候,新增的部分bit值都是設定為0。

getbit key offset

返回key對應的string在offset處的bit值。當offset超出了字串長度或key不存在時,返回0。

bitcount key [start end]

統計字串被設定為1的bit數。需要注意的是,這裡的start和end並不是位偏移,而是以位元組(8位)為單位來偏移的,比如bitcount foo 0 1是統計key為foo的字串中第乙個到第二個位元組中bit為1的總數。

bitmap常見的應用場景之一就是使用者簽到了,在這裡,我們以日期作為key,以使用者id作為位偏移,儲存使用者的簽到資訊(1為簽到,0為未簽到)。

其實現如下(spring boot):

public class checkinservice 

/*** 檢查使用者是否簽到

** @param userid

* @param date

* @return

*/public boolean ischeckin(long userid, string date)

/*** 統計特定日期簽到總人數

** @param date

* @return

*/public long countdatecheckin(string date)

});return optional.ofnullable(result).orelse(0l);

}/**

* 獲取使用者某個時間段簽到次數

** @param userid

* @param startdate

* @param enddate

* @return

*/public long countcheckin(long userid, string startdate, string enddate) );

return count.get();

}/**

* 更新使用者連續簽到天數:+1

* @param userid

*/public void updatecontinuouscheckin(long userid)

count ++;

stringredistemplate.opsforvalue().set(key, string.valueof(count));

//設定第二天過期

stringredistemplate.execute(new rediscallback()

});}

/*** 獲取使用者連續簽到天數

* @param userid

* @return

*/public long getcontinuouscheckin(long userid)

return long.parselong(val);

}private string getcheckinkey(string date)

private string getcontinuouscheckinkey(long userid)

}

完整**

Redis資料型別之Bitmaps

bitmaps最大的優點是 可以節省大量空間。例如,在以增量使用者id表示不同使用者的系統中,僅使用512 mb記憶體就可以記住40億使用者的一位資訊 例如,知道使用者是否要接收新聞通訊 凡是只有兩個狀態的資料都可以用bitmaps儲存,最後用來統計,比如活躍使用者和不活躍使用者,登入和未登入,打卡...

redis階段總結 php中redis的使用

今天是五一節了,學了一段時間的redis。由於專案進度原因,一直拖到現在今天做個收尾總結。安裝 wget 4.tar.gz cd phpredis 2.2 7 進入 phpredis 目錄 usr local php bin phpize php安裝後的路徑 configure with php c...

014redis的優化 redis工具的使用

一 redis優化 1 精簡鍵名和鍵值 鍵名 盡量精簡,但是也不能單純為了節約空間而使用不易理解的鍵名。鍵值 對於鍵值的數量固定的話可以使用0和1這樣的數字來表示,例如 male female right wrong 2 當業務場景不需要資料持久化時,關閉所有的持久化方式可以獲得最佳的效能 內部編碼...