Redis學習筆記之點陣圖
[TOC]
點陣圖定義
點陣圖並不是一種資料結構,其實就是一種普通的字串,也可以說是byte陣列。基本語法是setbit/getbit,剛才說了是一個byte陣列,所以也可以用set/get設定或獲取
SetBit語法: Setbit KEY_NAME OFFSET
GetBit語法: Getbit KEY_NAME OFFSET
應用場景
上面介紹了redis的點陣圖,對於redis點陣圖有什麼應用場景?假如要統計使用者一年簽到次數,這裡如果用記錄表來記錄的話,每個使用者就用存365條記錄,一千個使用者就是365*1000條記錄,想一下這個資料量是不少的,而且實際業務意義不是很明顯,那麼有什麼高效的方法可以替換?其實可以用本部落格介紹的Redis點陣圖來實現,剛才說了點陣圖就是byte數字,假如簽到就表示1,沒簽到就表示0,這裡可以用365個位元組來記錄前端數,這樣很節省資源了,提高了效率。這個例子就是redis點陣圖的很好應用,比如使用者簽到統計,月活躍使用者數統計等等業務場景都適合用點陣圖實現
基本使用
Redis點陣圖的基本語法是setbit/getbit,按照一次只存一個位元組,還是一次一個陣列字串整個存的情況,分為[零存整取]、[零存零取]、[整存零取],下面介紹的例子來自《Redis深度歷險:核心原理與應用實踐》一書
對於字串'hello',換成ASCII碼的二進位制為:
'h':0b1101000'
'e':0b1100101'
'l':0b1101100'
'l':0b1101100'
'o':'0b1101111'
[零存整取]的情況:setbit key為tk
//在第二位存“1” 127.0.0.1:6379> setbit tk 1 1 (integer) 0 //在第三位存"1" 127.0.0.1:6379> setbit tk 2 1 (integer) 0 //在第五位存"1" 127.0.0.1:6379> setbit tk 4 1 (integer) 0 //整個位元組陣列取出來 127.0.0.1:6379> get tk "h" 127.0.0.1:6379>
[零存零取]的情況:
//在第二位加“1”位 127.0.0.1:6379> setbit tk 1 1 (integer) 1 //在第三位加“1”位 127.0.0.1:6379> setbit tk 2 1 (integer) 1 //在第五位加“1”為 127.0.0.1:6379> setbit tk 4 1 (integer) 1 //取出第二位 127.0.0.1:6379> getbit tk 1 (integer) 1 //取出第三位 127.0.0.1:6379> getbit tk 2 (integer) 1 //取出第五位 127.0.0.1:6379> getbit tk 4 (integer) 1 //取出第六位 127.0.0.1:6379> getbit tk 5 (integer) 0 127.0.0.1:6379>
[整存零取]
//存整個字元 127.0.0.1:6379> set tk h OK //獲取一下第二位 127.0.0.1:6379> getbit tk 1 (integer) 1 //獲取一下第三位 127.0.0.1:6379> getbit tk 2 (integer) 1 //獲取一下第五位 127.0.0.1:6379> getbit tk 4 (integer) 1 //獲取一下第六位 127.0.0.1:6379> getbit tk 5 (integer) 0 127.0.0.1:6379>
特殊情況:
127.0.0.1:6379> setbit tk 0 1 (integer) 1 127.0.0.1:6379> setbit tk 1 1 (integer) 1 //不代表任何字元,返回16進位制符號 127.0.0.1:6379> get tk "\xc0" 127.0.0.1:6379>
查詢統計
Redis有提供查詢和統計函式,分別是bitpos和bitcount函式,其語法分別為:
bitcount語法:bitcount key [start end]
bitpos語法:bitpos key bit [start] [end]
127.0.0.1:6379> set tk hello OK //從第1個字元h算起,第一個“1”位的位置 127.0.0.1:6379> bitpos tk 1 1 1 (integer) 9 //從第2個字元2算起,第一個“1”位的位置 127.0.0.1:6379> bitpos tk 1 2 2 (integer) 17 //第一個“0”位 127.0.0.1:6379> bitpos tk 0 (integer) 0 //第一個“1”位 127.0.0.1:6379> bitpos tk 1 (integer) 1 //統計tk“1”的數量 127.0.0.1:6379> bitcount tk (integer) 21 //第一個字元h的“1”位數量 127.0.0.1:6379> bitcount tk 0 0 (integer) 3 //第一個字元h和第二個字元e“1”位的數量 127.0.0.1:6379> bitcount tk 0 1 (integer) 7 127.0.0.1:6379>