深入Redis(三)位圖
阿新 • • 發佈:2018-08-19
單個 就是 pos 特殊 極值 策略 失敗 tco 通過 魔術指令
位圖
位圖不是特殊的數據結構,其內容就是普通的字符串,即byte數組,可以使用get
/set
直接獲取整個位圖的內容,也可以通過getbit
/setbit
來將byte數組看成位數組來處理。
基本使用
Redis的位數組是自動拓展的,若偏移位置超出現有範圍,則自動用0擴充。
get
整取,set
整存,getbit
零取,setbit
零存,對應的則是直接操作字符串還是操作位。
統計和查找
bitcount
用於統計指定位置範圍內1的個數,bitpos
用於查找指定範圍內出現的第一個0或1的位。
bitcount
所設置的範圍是字符的範圍而不是位的範圍,也就是說,這個範圍是對字符的索引,其位範圍是8的倍數。
魔術指令bitfield
前面設置和獲取指定位的值都是單個位的,如要一次操作多個位,則必須使用管道來處理。但是從Redis3.2開始,增加了一條指令,使得不用管道也能一次操作多個位。
bitfield
有三個子指令,分別是get
/set
/incrby
,它們可以對指定位片段進行讀寫,但最多只能處理64個連續位,超過64個就必須使用多個子指令,bitfield
支持一次執行多個子指令。
127.0.0.1:6379> set w hello OK 127.0.0.1:6379> bitfield w get u4 0 # 從第一個位開始取4個位,結果是無符號數u (integer) 6 127.0.0.1:6379> bitfield w get u3 2 # 從第3個位開始取3個位,結果是無符號數u (integer) 5 127.0.0.1:6379> bitfield w get i4 0 # 從第一個位開始取4個位,結果是符號數i 1) (integer) 6 127.0.0.1:6379> bitfield w get i3 2 # 從第3個位開始取3個位,結果是符號數i 1) (integer) -3
無符號數就是取位數組全部為值,符號數就是取位數組第一位為符號,其它位為值。
127.0.0.1:6379> bitfield w get u4 0 get u3 2 get i4 0 get i3 2 # 一次執行多條子指令
1) (integer) 6
2) (integer) 5
3) (integer) 6
4) (integer) -3
127.0.0.1:6379> bitfield w set u8 8 97 # 從第八位開始,接下來的8位用無符號數97替代
1) (integer) 101
127.0.0.1:6379> get w
"hallo"
incrby
指令對指定範圍位進行自增操作,溢出將會折返,無符號數0-255,有符號數-128-127。
bitfield
提供溢出策略子指令overflow
,默認折返wrap
,還可選擇失敗fail
(報錯不執行),飽和截斷sat
(超過範圍停留在極值),overflow
指令只影響一條指令,後續繼續默認折返wrap
。
bitfield
可同時混合執行多個get
/set
/incrby
子指令。
深入Redis(三)位圖