?
This document uses PHP Chinese website manual Release
BITFIELD key [GET type offset] [SET type offset value] [INCRBY type offset increment] [OVERFLOW WRAP|SAT|FAIL]
自3.2.0起可用。
時(shí)間復(fù)雜度: O(1)用于指定的每個(gè)子命令
該命令將 Redis 字符串視為一個(gè)位數(shù)組,并且能夠處理具有不同位寬和任意非(必要)對齊偏移量的特定整數(shù)字段。實(shí)際上,使用此命令可以將位偏移量為1234的帶符號5位整數(shù)設(shè)置為特定值,從偏移量4567中檢索31位無符號整數(shù)。類似地,該命令處理指定整數(shù)的遞增和遞減,提供保證和良好指定的溢出和下溢行為,用戶可以配置。
BITFIELD 能夠在同一個(gè)命令調(diào)用中使用多位字段。它需要執(zhí)行一系列操作,并返回一個(gè)響應(yīng)數(shù)組,其中每個(gè)數(shù)組都與參數(shù)列表中的相應(yīng)操作相匹配。
例如,以下命令將位偏移量為100的8位有符號整數(shù)加1,并在位偏移量0處獲取4位無符號整數(shù)的值:
> BITFIELD mykey INCRBY i5 100 1 GET u4 01) (integer) 12) (integer) 0
注意:
使用當(dāng)前字符串長度以外的 GET 位(包括密鑰根本不存在的情況)進(jìn)行尋址,結(jié)果執(zhí)行的操作與缺失部分一樣都是由設(shè)置為0的位組成。
2. 根據(jù)需要的最小長度,根據(jù)所觸及的最遠(yuǎn)位,使用當(dāng)前字符串長度之外的 SET 或 INCRBY 位進(jìn)行尋址將放大字符串,根據(jù)需要對其進(jìn)行填零。
以下是支持的命令列表。
GET <type>
<offset>
- 返回指定的位域。
SET <type>
<offset>
<value>
- 設(shè)置指定的位域并返回其舊值。
INCRBY <type>
<offset>
<increment>
- 遞增或遞減(如果給定負(fù)遞增)指定的位域并返回新值。
還有一個(gè)子命令通過設(shè)置溢出行為來改變連續(xù)的 INCRBY子 命令調(diào)用的行為:
OVERFLOW [WRAP|SAT|FAIL]
在期望整數(shù)類型的情況下,可以通過i
為有符號整數(shù)和u
無符號整數(shù)加上整數(shù)類型的位數(shù)來構(gòu)成它。例如u8
,一個(gè)8位的無符號整數(shù),i16
是一個(gè)16位的有符號整數(shù)。支持的類型對于有符號整數(shù)最多為64位,對于無符號整數(shù)最多為63位。使用無符號整數(shù)的限制是由于當(dāng)前Redis協(xié)議無法將64位無符號整數(shù)作為答復(fù)返回。位和位置偏移有兩種方式可以指定位域命令中的偏移量。如果指定了一個(gè)沒有任何前綴的數(shù)字,它將被用作字符串內(nèi)的基于零的位偏移量。但是如果偏移量前綴為a#
字符,指定的偏移量乘以整數(shù)類型的寬度,例如:BITFIELD mystring SET i8#0 100 i8#1 200將設(shè)置第一個(gè)i8整數(shù)在偏移量0和第二個(gè)偏移量為8.這種方式你沒有如果你想要的是一個(gè)給定大小的整數(shù)數(shù)組,你可以在你的客戶端內(nèi)部進(jìn)行數(shù)學(xué)運(yùn)算。溢出控制使用該OVERFLOW
命令,用戶可以通過指定一個(gè)來微調(diào)增量的行為或減少溢出(或下溢)以下行為:
WRAP:環(huán)繞,包含有符號和無符號整數(shù)。在無符號整數(shù)的情況下,包裝類似于以整數(shù)可以包含的最大值(C標(biāo)準(zhǔn)行為)來執(zhí)行操作。使用帶符號整數(shù),而不是包裝意味著溢出重新開始朝向最負(fù)值,并且溢出朝向最正值,例如,如果i8
整數(shù)設(shè)置為127,則將其遞增1 -128
。
SAT:使用飽和算術(shù),即在下溢時(shí)將該值設(shè)置為最小整數(shù)值,并在溢出時(shí)將其設(shè)置為最大整數(shù)值。例如,i8
從數(shù)值120開始遞增一個(gè)以10 為增量的整數(shù)將導(dǎo)致數(shù)值127,并且進(jìn)一步增量將始終使數(shù)值保持在127.在下溢時(shí)發(fā)生同樣的情況,但是朝向該數(shù)值被阻塞在最大負(fù)值。
FAIL:在這種模式下,沒有檢測到溢出或下溢操作。相應(yīng)的返回值設(shè)置為 NULL,以向調(diào)用者發(fā)送信號。
請注意,每條OVERFLOW
語句只影響子命令列表中后面的 INCRBY命令,直到下一條OVERFLOW
語句為止。
默認(rèn)情況下,如果未另外指定,則使用 WRAP。
> BITFIELD mykey incrby u2 100 1 OVERFLOW SAT incrby u2 102 11) (integer) 12) (integer) 1> BITFIELD mykey incrby u2 100 1 OVERFLOW SAT incrby u2 102 11) (integer) 22) (integer) 2> BITFIELD mykey incrby u2 100 1 OVERFLOW SAT incrby u2 102 11) (integer) 32) (integer) 3> BITFIELD mykey incrby u2 100 1 OVERFLOW SAT incrby u2 102 11) (integer) 02) (integer) 3
該命令返回一個(gè)數(shù)組,其中每個(gè)條目都是在相同位置給出的子命令的相應(yīng)結(jié)果。OVERFLOW
子命令不會計(jì)為生成回復(fù)。
以下是OVERFLOW FAIL
返回 NULL 的示例。
> BITFIELD mykey OVERFLOW FAIL incrby u2 102 11) (nil)
這個(gè)命令的動機(jī)是,將許多小整數(shù)存儲為單個(gè)大位圖(或通過幾個(gè)鍵分段以避免擁有大量密鑰)的能力具有極高的內(nèi)存效率,并為要應(yīng)用的Redis打開新的使用案例,尤其是實(shí)時(shí)分析領(lǐng)域。這種用例受控于以受控方式指定溢出的能力。
有趣的事實(shí):Reddit的2017年4月愚人節(jié)項(xiàng)目r / place是使用Redis BITFIELD命令構(gòu)建的,以便獲取內(nèi)存中的協(xié)作畫布表示。
通常 BITFIELD 是一個(gè)快速命令,但是請注意,處理當(dāng)前短字符串的遠(yuǎn)位會觸發(fā)一個(gè)分配,這比在已存在的位上執(zhí)行該命令可能更昂貴。
BITFIELD 使用的表示認(rèn)為位圖的位號為0是第一個(gè)字節(jié)的最高有效位,依此類推,因此例如在偏移7處將5位無符號整數(shù)設(shè)置為值23,并將其設(shè)置為先前設(shè)置為全零,將產(chǎn)生以下表示:
+--------+--------+|00000001|01110000|+--------+--------+
當(dāng)偏移和整數(shù)大小與字節(jié)邊界對齊時(shí),這與大端相同,但是當(dāng)這種對齊不存在時(shí),重要的是也要理解字節(jié)中的位是如何排序的。