1. 程式人生 > >深入Redis(三)位圖

深入Redis(三)位圖

單個 就是 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(三)位圖