優勢
1.基於最小的單位bit進行儲存,所以非常省空間。
2.設定時候時間複雜度o(1)、讀取時候時間複雜度o(n),操作是非常快的。
3.二進位制資料的儲存,進行相關計算的時候非常快。
4.方便擴容
限制redis中bit對映被限制在512mb之內,所以最大是2^32位。建議每個key的位數都控制下,因為讀取時候時間複雜度o(n),越大的串讀的時間花銷越多。
操作命令
setbit key offset value :對指定的key的value的指定偏移(offset)的位置1或0
getbit key offset : 獲取offset設定的值,未設定過預設返回0
bitcount key [start end] :統計指定key位置為1的數量
bit運算,bitop 支援四種表示式運算:
and(交集)
or(並集)
xor(異或)
not(取非)
bitmap的使用場景
總的來說就兩種,以使用者為例子:
1.一種是某一使用者的橫向擴充套件,即此個key值中記錄這當前使用者的各種狀態值,允許無限擴充套件(2^32內)
點評:這種用法基本上是很少用的,因為每個key攜帶uid資訊,如果儲存的key的空間大於value,從空間角度看有一定的優化空間,如果是記錄長尾的則可以考慮。
2.一種是某一使用者的縱向擴充套件,即每個key只記錄當前業務屬性的狀態,每個uid當作bit位來記錄資訊(使用者超過2^32內需要分片儲存)
例如:3:統計活躍使用者,使用時間作為快取的key,然後使用者id為offset,如果當日活躍過就設定為1。之後通過bitop進行二進位制計算算出在某段時間內使用者的活躍情況。
優化:1.空間
redis的bitmap已經是最小單位的儲存了,有沒有辦法對二進位制儲存的資訊再進行壓縮呢?進一步省空間?
可以對記錄的二進位制資料進行壓縮。常見的二進位制壓縮技術都是基於rle(run length encoding。對於乙個很大的bitmap,如果裡邊的資料分布很稀疏(說明有很多大片連續的0),採用rle編碼後,占用的空間會比原始的bitmap小很多。
2.時間
redis雖然是在記憶體操作,但是超過redis指定儲存在記憶體的閥值之後,會被搞到磁碟中。要是進行大範圍的計算還需要從磁碟中取出到內存在計算比較耗時,效率也不高,有沒有辦法盡可能記憶體中多放一些資料,縮短時間?
採用rle編碼的bitmap不需要進行解壓縮,就可以直接進行and/or/xor等各類計算;因此採用這類壓縮技術的bitmap,載入到記憶體後還是以壓縮的方式存在,從而可以保證計算時候的低記憶體消耗;而採用word(計算機的字長,64位系統就是64bit)對齊等技術又保證了對cpu資源的高效利用。因此採用這類壓縮技術的bitmap,保持了bitmap資料結構最重要的乙個特性,就是高效的針對每個bit的邏輯運算。
常見的壓縮技術包括 bbc(有專利保護),
Redis中bitmap的妙用
在redis中我們經常用到set,get等命令,細心的你有沒有發現,還有幾個相似的命令叫setbit,getbit,它們是用來幹嘛的?就是通過乙個bit位來表示某個元素對應的值或者狀態,其中的key就是對應元素本身。我們知道8個bit可以組成乙個byte,所以bitmap本身會極大的節省儲存空間。r...
Redis中bitmap的妙用
23k 次閱讀 讀完需要 12 分鐘 在redis中我們經常用到set,get等命令,細心的你有沒有發現,還有幾個相似的命令叫setbit,getbit,它們是用來幹嘛的?就是通過乙個bit位來表示某個元素對應的值或者狀態,其中的key就是對應元素本身。我們知道8個bit可以組成乙個byte,所以b...
Redis中bitmap的妙用
就是通過乙個bit位來表示某個元素對應的值或者狀態,其中的key就是對應元素本身。我們知道8個bit可以組成乙個byte,所以bitmap本身會極大的節省儲存空間。redis從2.2.0版本開始新增了setbit,getbit,bitcount等幾個bitmap相關命令。雖然是新命令,但是並沒有新增...