一、setbit是什麼?
setbit是Redis提供的bitmap數據類型中的一條命令。bitmap數據類型用於表示二進制的位圖,每一位表示0或1,可以用於記錄某個元素是否出現過、某個用戶是否在線等場景。
setbit命令用於設置指定位的值,可以設置為0或1。該命令有三個參數,分別是鍵名、偏移量、值。比如SETBIT mykey 7 1表示將mykey鍵的第7位設置為1。
SETBIT mykey 7 1
二、setbit的使用場景
bitmap數據類型雖然基於比特,但是可以當做一個整數類型來處理,因為其每個比特都只有0和1兩種值。因此,雖然比特個數有限,但是可以存下大量的信息。
setbit命令可以用於以下場景:
1.在線用戶統計:可以使用bitmap數據類型記錄某個用戶是否在線。為了便於統計在線用戶數,可以使用bitcount命令統計比特位為1的個數。
SETBIT online_user 1001 1 # 代表用戶1001在線 SETBIT online_user 2002 1 # 代表用戶2002在線 SETBIT online_user 3003 1 # 代表用戶3003在線 # 統計在線用戶數 BITCOUNT online_user
2.物品去重:可以使用bitmap數據類型實現去重,簡單有效。在需要去重的場合,利用setbit命令,將每個元素的狀態用各自的比特位表示,比如用第i位表示元素i是否已存在。當一個元素需要插入時,先利用getbit命令確認元素是否存在(檢查第i位的值),如果第i位的值為1,證明元素已經存在,直接返回;如果第i位的值為0,證明元素不存在,調用setbit命令將第i位的值設置為1。
# 插入元素 SETBIT existed_items 12345 1 # 判斷元素是否存在 GETBIT existed_items 12345
三、setbit的性能分析
setbit命令實現了對指定位的原子性操作,是原子性最強的Redis命令之一,非常適合於高並發的場景。比如很多廣告系統都採用bitmap數據類型進行去重,並將bitmap數據存儲在Redis中,利用setbit命令插入新的廣告ID,避免了傳統的關係型數據庫在高並發場景下的不穩定性。
同時,因為bitmap數據類型只有0、1兩種取值,相較於字符串類型,可以大大降低內存消耗。另外,setbit命令只操作一個比特位,因此其執行時間非常短,對Redis性能影響不大。
四、setbit的使用技巧
1.利用位運算實現多個狀態的存儲:因為每個比特位只有0和1兩種取值,可以利用相應位運算的結果來存儲多個狀態。比如利用與運算(&)可以判斷指定的一組比特是否都為1,利用或運算(|)可以將指定的一組比特置為1。
# 利用與運算判斷多個位是否為1 SETBIT mykey 3 1 # 將第3位設置為1 SETBIT mykey 7 1 # 將第7位設置為1 GET mykey # 輸出結果為 00001001 # 判斷第3、7位是否為1 GETBIT mykey 3 # 返回1 GETBIT mykey 7 # 返回1 GETBIT mykey 5 # 返回0 # 利用或運算設置多個位為1 SETBIT mykey 3 1 SETBIT mykey 7 1 SETBIT mykey 5 1 GET mykey # 輸出結果為 00011001
2.使用psetex命令設置位的過期時間:雖然bitmap數據類型不支持設置過期時間,但是可以將setbit命令與psetex命令結合使用,來實現有限時間內使用bitmap數據類型臨時存儲信息的功能。比如可以利用bitmap數據類型記錄某個廣告ID的展示次數,同時使用psetex命令設置過期時間,避免了資源浪費。
# 設置某個廣告ID的展示次數為10次 SETBIT AD_VIEW 12345 1 # 設置過期時間為1個小時 PSETEX AD_VIEW 3600000 "EXPIRED"
五、setbit的代碼示例
# 設置第7位為1 SETBIT mykey 7 1 # 獲取第7位的值 GETBIT mykey 7 # 判斷多個比特是否為1 SETBIT mykey 3 1 SETBIT mykey 7 1 GET mykey # 結果為00001001 GETBIT mykey 3 # 返回1 GETBIT mykey 5 # 返回0 # 將多個位都設置為1 SETBIT mykey 3 1 SETBIT mykey 7 1 SETBIT mykey 5 1 GET mykey # 結果為00011001 # 利用psetex命令設置過期時間 SETBIT AD_VIEW 12345 1 # 設置過期時間為1個小時 PSETEX AD_VIEW 3600000 "EXPIRED"
原創文章,作者:WILA,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/133955.html