bitmaps並不屬於redis中資料結構的一種,它的命令基於string操作,是set
、get
等一系列字串操作的一種擴充套件,與其不同的是,它提供的是位級別的操作,從這個角度看,我們也可以把它當成是一種位陣列、位向量結構。當我們需要訪問一些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 當業務場景不需要資料持久化時,關閉所有的持久化方式可以獲得最佳的效能 內部編碼...