命令簡介:
1)setbit:設定字串指定偏移量bit
2)getbit:獲取字串指定偏移量bit
3)bitcount:獲取字串位中為1的數量
4)bitpos:獲取指定范圍的位圖中第一個值為bit的二進制位的位置
5)bitop:對一個或者多個保存二進制位的字串key進行位元操作,并且將結果保存到destkey上
6)bitfield
命令詳解:
1.setbit
可用版本: >=2.2.0
時間復雜度: O(1)
命令格式: setbit key offset value
作用:
對key存盤的字串值,設定或者清除指定偏移量上的位Bit,
回傳值:
指定偏移量原本存盤的位,
注意:
位的設定或者清除取決于value引數,可以是0與1,
當key不存在時,會自動生成,
字串會自動進行伸縮以確保它可以將value保存在指定的偏移量上,當字串進行伸縮時,空白位置以0填充,
offset引數必須大于等于0,小于2^32,
2.getbit
可用版本: >=2.2.0
時間復雜度: O(1)
命令格式: getbit key offset
作用:
獲取key存盤字串值,指定偏移量上的位,
回傳值:
指定偏移量原本存盤的位,
注意:
當offset大于字串長度,或者key不存在時回傳0,
3.bitcount
可用版本: >=2.6.0
時間復雜度: O(N)
命令格式: bitcount key [start] [end]
作用:
獲取key存盤字串值,一定范圍內,位值為1的數量,
回傳值:
位值為1的數量,
注意:
start與end可以是負數,
不存在的key當作空字串處理,回傳0,
4.bitpos
可用版本: >=2.8.7
時間復雜度: O(N)
命令格式: bitpos key bit [start] [end]
作用:
獲取指定范圍的位圖中第一個值為bit的二進制位的位置,
回傳值:
整數位置,
注意:
默認情況下,檢測整個位圖,也可以使用start end引數,指定檢測的范圍,
5.bitop
可用版本: >=2.6.0
時間復雜度: O(N)
命令格式: bitop operation destkey key [key...]
作用:
對一個或多個保存二進制位的字串 key 進行位元操作,并將結果保存到 destkey 上,
回傳值:
保存到 destkey 的字串的長度,和輸入 key 中最長的字串長度相等,
注意:
operation之內是以下幾個選項:
1)AND-對一個或者多個key求邏輯并,并將結果保存到destkey上,
2)OR-對一個或者多個key求邏輯或,并將結果保存到destkey上,
3)XOR-對一個或者多個key求邏輯異或,并將結果保存到destkey上,
4)NOT-對一個或者多個key求邏輯非,并將結果保存到destkey上,not只支持一個key,
字串長度不一時,短的字串將會使用0自動填充,
6.bitfield
可用版本: >=3.2.0
時間復雜度: O(1)
命令格式: bitfield key [GET type offset] [set type offset value] [incrby type offset increment] [overflow wrap|sat|fail]
作用:
bitfield命令將一個redis字串看作是一個由二進制位組成的陣列,并對這個陣列中存盤的長度不同的整數進行訪問,
bitfield命令可以在一次呼叫中同時對多個位范圍進行操作,它接受一系列待執行的操作作為引數,并回傳一個陣列作為回復,陣列中每一個元素就是對應操作的執行結果,
BITFIELD 命令的作用在于它能夠將很多小的整數儲存到一個長度較大的位圖中, 又或者將一個非常龐大的鍵分割為多個較小的鍵來進行儲存, 從而非常高效地使用記憶體, 使得 Redis 能夠得到更多不同的應用 —— 特別是在實時分析領域: BITFIELD 能夠以指定的方式對計算溢位進行控制的能力, 使得它可以被應用于這一領域,
回傳值:
BITFIELD 命令的回傳值是一個陣列, 陣列中的每個元素對應一個被執行的子命令, 需要注意的是, OVERFLOW 子命令本身并不產生任何回復,
注意:
使用 GET 子命令對超出字串當前范圍的二進制位進行訪問(包括鍵不存在的情況), 超出部分的二進制位的值將被當做是 0 ,
使用 SET 子命令或者 INCRBY 子命令對超出字串當前范圍的二進制位進行訪問將導致字串被擴大, 被擴大的部分會使用值為 0 的二進制位進行填充, 在對字串進行擴展時, 命令會根據字串目前已有的最遠端二進制位, 計算出執行操作所需的最小長度,
子命令支持:
GET
SET
INCRBY
OVERFLOW [WRAP|SAT|FAIL]——改變之后執行的 INCRBY 子命令在發生溢位情況時的行為,
偏移量:
在二進制位范圍命令中, 用戶有兩種方法來設定偏移量:
如果用戶給定的是一個沒有任何前綴的數字, 那么這個數字指示的就是字串以零為開始(zero-base)的偏移量,
另一方面, 如果用戶給定的是一個帶有 # 前綴的偏移量, 那么命令將使用這個偏移量與被設定的數字型別的位長度相乘, 從而計算出真正的偏移量,
比如說, 對于以下這個命令來說:
BITFIELD mystring SET i8 #0 100 i8 #1 200
命令會把 mystring 鍵里面, 第一個 i8 長度的二進制位的值設定為 100 , 并把第二個 i8 長度的二進制位的值設定為 200 , 當我們把一個字串鍵當成陣列來使用, 并且陣列中儲存的都是同等長度的整數時, 使用 # 前綴可以讓我們免去手動計算被設定二進制位所在位置的麻煩,
溢位控制:
用戶可以通過 OVERFLOW 命令以及以下展示的三個引數, 指定 BITFIELD 命令在執行自增或者自減操作時, 碰上向上溢位(overflow)或者向下溢位(underflow)情況時的行為:
WRAP : 使用回繞(wrap around)方法處理有符號整數和無符號整數的溢位情況, 對于無符號整數來說, 回繞就像使用數值本身與能夠被儲存的最大無符號整數執行取模計算, 這也是 C 語言的標準行為, 對于有符號整數來說, 上溢將導致數字重新從最小的負數開始計算, 而下溢將導致數字重新從最大的正數開始計算, 比如說, 如果我們對一個值為 127 的 i8 整數執行加一操作, 那么將得到結果 -128 ,
SAT : 使用飽和計算(saturation arithmetic)方法處理溢位, 也即是說, 下溢計算的結果為最小的整數值, 而上溢計算的結果為最大的整數值, 舉個例子, 如果我們對一個值為 120 的 i8 整數執行加 10 計算, 那么命令的結果將為 i8 型別所能儲存的最大整數值 127 , 與此相反, 如果一個針對 i8 值的計算造成了下溢, 那么這個 i8 值將被設定為 -127 ,
FAIL : 在這一模式下, 命令將拒絕執行那些會導致上溢或者下溢情況出現的計算, 并向用戶回傳空值表示計算未被執行,
需要注意的是, OVERFLOW 子命令只會對緊隨著它之后被執行的 INCRBY 命令產生效果, 這一效果將一直持續到與它一同被執行的下一個 OVERFLOW 命令為止, 在默認情況下, INCRBY 命令使用 WRAP 方式來處理溢位計算,
以下是一個使用 OVERFLOW 子命令來控制溢位行為的例子:
> BITFIELD mykey incrby u2 100 1 OVERFLOW SAT incrby u2 102 1
1) (integer) 1
2) (integer) 1
> BITFIELD mykey incrby u2 100 1 OVERFLOW SAT incrby u2 102 1
1) (integer) 2
2) (integer) 2
> BITFIELD mykey incrby u2 100 1 OVERFLOW SAT incrby u2 102 1
1) (integer) 3
2) (integer) 3
> BITFIELD mykey incrby u2 100 1 OVERFLOW SAT incrby u2 102 1
1) (integer) 0 -- 使用默認的 WRAP 方式處理溢位
2) (integer) 3 -- 使用 SAT 方式處理溢位
而以下則是一個因為 OVERFLOW FAIL 行為而導致子命令回傳空值的例子:
> BITFIELD mykey OVERFLOW FAIL incrby u2 102 1
1) (nil)
性能注意事項:
BITFIELD 在一般情況下都是一個快速的命令, 需要注意的是, 訪問一個長度較短的字串的遠端二進制位將引發一次記憶體分配操作, 這一操作花費的時間可能會比命令訪問已有的字串花費的時間要長,
二進制位的排列:
BITFIELD 把位圖第一個位元組偏移量 0 上的二進制位看作是 most significant 位, 以此類推, 舉個例子, 如果我們對一個已經預先被全部設定為 0 的位圖進行設定, 將它在偏移量 7 的值設定為 5 位無符號整數值 23 (二進制位為 10111 ), 那么命令將生產出以下這個位圖表示:
+--------+--------+
|00000001|01110000|
+--------+--------+
當偏移量和整數長度與位元組邊界進行對齊時, BITFIELD 表示二進制位的方式跟大端表示法(big endian)一致, 但是在沒有對齊的情況下, 理解這些二進制位是如何進行排列也是非常重要的,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/252989.html
標籤:其他
上一篇:Geo命令
下一篇:TTL 生存時間
