小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Bit命令

 小樣樣樣樣樣樣 2022-02-13

命令簡介:
1)setbit:設(shè)置字符串指定偏移量bit
2)getbit:獲取字符串指定偏移量bit
3)bitcount:獲取字符串位中為1的數(shù)量
4)bitpos:獲取指定范圍的位圖中第一個值為bit的二進制位的位置
5)bitop:對一個或者多個保存二進制位的字符串key進行位元操作,并且將結(jié)果保存到destkey上
6)bitfield

命令詳解:
1.setbit
可用版本: >=2.2.0
時間復(fù)雜度: O(1)
命令格式: setbit key offset value
作用:
對key存儲的字符串值,設(shè)置或者清除指定偏移量上的位Bit。
返回值:
指定偏移量原本存儲的位。
注意:
位的設(shè)置或者清除取決于value參數(shù),可以是0與1。
當(dāng)key不存在時,會自動生成。
字符串會自動進行伸縮以確保它可以將value保存在指定的偏移量上。當(dāng)字符串進行伸縮時,空白位置以0填充。
offset參數(shù)必須大于等于0,小于2^32。

2.getbit
可用版本: >=2.2.0
時間復(fù)雜度: O(1)
命令格式: getbit key offset
作用:
獲取key存儲字符串值,指定偏移量上的位。
返回值:
指定偏移量原本存儲的位。
注意:
當(dāng)offset大于字符串長度,或者key不存在時返回0。

3.bitcount
可用版本: >=2.6.0
時間復(fù)雜度: O(N)
命令格式: bitcount key [start] [end]
作用:
獲取key存儲字符串值,一定范圍內(nèi),位值為1的數(shù)量。
返回值:
位值為1的數(shù)量。
注意:
start與end可以是負數(shù)。
不存在的key當(dāng)作空字符串處理,返回0。

4.bitpos
可用版本: >=2.8.7
時間復(fù)雜度: O(N)
命令格式: bitpos key bit [start] [end]
作用:
獲取指定范圍的位圖中第一個值為bit的二進制位的位置。
返回值:
整數(shù)位置。
注意:
默認情況下,檢測整個位圖。也可以使用start end參數(shù),指定檢測的范圍。

5.bitop
可用版本: >=2.6.0
時間復(fù)雜度: O(N)
命令格式: bitop operation destkey key [key...]
作用:
對一個或多個保存二進制位的字符串 key 進行位元操作,并將結(jié)果保存到 destkey 上。
返回值:
保存到 destkey 的字符串的長度,和輸入 key 中最長的字符串長度相等。
注意:
operation之內(nèi)是以下幾個選項:
1)AND-對一個或者多個key求邏輯并,并將結(jié)果保存到destkey上。
2)OR-對一個或者多個key求邏輯或,并將結(jié)果保存到destkey上。
3)XOR-對一個或者多個key求邏輯異或,并將結(jié)果保存到destkey上。
4)NOT-對一個或者多個key求邏輯非,并將結(jié)果保存到destkey上,not只支持一個key。
字符串長度不一時,短的字符串將會使用0自動填充。

6.bitfield
可用版本: >=3.2.0
時間復(fù)雜度: O(1)
命令格式: bitfield key [GET type offset] [set type offset value] [incrby type offset increment] [overflow wrap|sat|fail]
作用:
bitfield命令將一個redis字符串看作是一個由二進制位組成的數(shù)組,并對這個數(shù)組中存儲的長度不同的整數(shù)進行訪問。
bitfield命令可以在一次調(diào)用中同時對多個位范圍進行操作,它接受一系列待執(zhí)行的操作作為參數(shù),并返回一個數(shù)組作為回復(fù),數(shù)組中每一個元素就是對應(yīng)操作的執(zhí)行結(jié)果。
BITFIELD 命令的作用在于它能夠?qū)⒑芏嘈〉恼麛?shù)儲存到一個長度較大的位圖中, 又或者將一個非常龐大的鍵分割為多個較小的鍵來進行儲存, 從而非常高效地使用內(nèi)存, 使得 Redis 能夠得到更多不同的應(yīng)用 —— 特別是在實時分析領(lǐng)域: BITFIELD 能夠以指定的方式對計算溢出進行控制的能力, 使得它可以被應(yīng)用于這一領(lǐng)域。
返回值:
BITFIELD 命令的返回值是一個數(shù)組, 數(shù)組中的每個元素對應(yīng)一個被執(zhí)行的子命令。 需要注意的是, OVERFLOW 子命令本身并不產(chǎn)生任何回復(fù)。
注意:
使用 GET 子命令對超出字符串當(dāng)前范圍的二進制位進行訪問(包括鍵不存在的情況), 超出部分的二進制位的值將被當(dāng)做是 0 。
使用 SET 子命令或者 INCRBY 子命令對超出字符串當(dāng)前范圍的二進制位進行訪問將導(dǎo)致字符串被擴大, 被擴大的部分會使用值為 0 的二進制位進行填充。 在對字符串進行擴展時, 命令會根據(jù)字符串目前已有的最遠端二進制位, 計算出執(zhí)行操作所需的最小長度。
子命令支持:
GET —— 返回指定的二進制位范圍。
SET —— 對指定的二進制位范圍進行設(shè)置,并返回它的舊值。
INCRBY —— 對指定的二進制位范圍執(zhí)行加法操作,并返回它的舊值。用戶可以通過向 increment 參數(shù)傳入負值來實現(xiàn)相應(yīng)的減法操作。
OVERFLOW [WRAP|SAT|FAIL]——改變之后執(zhí)行的 INCRBY 子命令在發(fā)生溢出情況時的行為。
偏移量:
在二進制位范圍命令中, 用戶有兩種方法來設(shè)置偏移量:
如果用戶給定的是一個沒有任何前綴的數(shù)字, 那么這個數(shù)字指示的就是字符串以零為開始(zero-base)的偏移量。
另一方面, 如果用戶給定的是一個帶有 # 前綴的偏移量, 那么命令將使用這個偏移量與被設(shè)置的數(shù)字類型的位長度相乘, 從而計算出真正的偏移量。
比如說, 對于以下這個命令來說:
BITFIELD mystring SET i8 #0 100 i8 #1 200

命令會把 mystring 鍵里面, 第一個 i8 長度的二進制位的值設(shè)置為 100 , 并把第二個 i8 長度的二進制位的值設(shè)置為 200 。 當(dāng)我們把一個字符串鍵當(dāng)成數(shù)組來使用, 并且數(shù)組中儲存的都是同等長度的整數(shù)時, 使用 # 前綴可以讓我們免去手動計算被設(shè)置二進制位所在位置的麻煩。
溢出控制:
用戶可以通過 OVERFLOW 命令以及以下展示的三個參數(shù), 指定 BITFIELD 命令在執(zhí)行自增或者自減操作時, 碰上向上溢出(overflow)或者向下溢出(underflow)情況時的行為:
WRAP : 使用回繞(wrap around)方法處理有符號整數(shù)和無符號整數(shù)的溢出情況。 對于無符號整數(shù)來說, 回繞就像使用數(shù)值本身與能夠被儲存的最大無符號整數(shù)執(zhí)行取模計算, 這也是 C 語言的標(biāo)準(zhǔn)行為。 對于有符號整數(shù)來說, 上溢將導(dǎo)致數(shù)字重新從最小的負數(shù)開始計算, 而下溢將導(dǎo)致數(shù)字重新從最大的正數(shù)開始計算。 比如說, 如果我們對一個值為 127 的 i8 整數(shù)執(zhí)行加一操作, 那么將得到結(jié)果 -128 。
SAT : 使用飽和計算(saturation arithmetic)方法處理溢出, 也即是說, 下溢計算的結(jié)果為最小的整數(shù)值, 而上溢計算的結(jié)果為最大的整數(shù)值。 舉個例子, 如果我們對一個值為 120 的 i8 整數(shù)執(zhí)行加 10 計算, 那么命令的結(jié)果將為 i8 類型所能儲存的最大整數(shù)值 127 。 與此相反, 如果一個針對 i8 值的計算造成了下溢, 那么這個 i8 值將被設(shè)置為 -127 。
FAIL : 在這一模式下, 命令將拒絕執(zhí)行那些會導(dǎo)致上溢或者下溢情況出現(xiàn)的計算, 并向用戶返回空值表示計算未被執(zhí)行。
需要注意的是, OVERFLOW 子命令只會對緊隨著它之后被執(zhí)行的 INCRBY 命令產(chǎn)生效果, 這一效果將一直持續(xù)到與它一同被執(zhí)行的下一個 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 行為而導(dǎo)致子命令返回空值的例子:

> BITFIELD mykey OVERFLOW FAIL incrby u2 102 1
1) (nil)

性能注意事項:
BITFIELD 在一般情況下都是一個快速的命令, 需要注意的是, 訪問一個長度較短的字符串的遠端二進制位將引發(fā)一次內(nèi)存分配操作, 這一操作花費的時間可能會比命令訪問已有的字符串花費的時間要長。
二進制位的排列:
BITFIELD 把位圖第一個字節(jié)偏移量 0 上的二進制位看作是 most significant 位, 以此類推。 舉個例子, 如果我們對一個已經(jīng)預(yù)先被全部設(shè)置為 0 的位圖進行設(shè)置, 將它在偏移量 7 的值設(shè)置為 5 位無符號整數(shù)值 23 (二進制位為 10111 ), 那么命令將生產(chǎn)出以下這個位圖表示:

+--------+--------+
|00000001|01110000|
+--------+--------+

當(dāng)偏移量和整數(shù)長度與字節(jié)邊界進行對齊時, BITFIELD 表示二進制位的方式跟大端表示法(big endian)一致, 但是在沒有對齊的情況下, 理解這些二進制位是如何進行排列也是非常重要的。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多