1. bitmap
? bitmap(位圖)這個結(jié)構(gòu)聽起來好像是個新的數(shù)據(jù)結(jié)構(gòu)辜王,事實(shí)上并不是劈狐,bitmap其實(shí)和string并沒有什么本質(zhì)上的區(qū)別,只不過bitmap操作的是某一個二進(jìn)制位而string操作的是某一段二進(jìn)制位呐馆。舉個例子:我們熟知ASCII碼共有8位二進(jìn)制肥缔,共計128個值。bitmap操作的就是這8位二進(jìn)制哪個為0哪個為1汹来,而string給我們的感知其實(shí)是在操作這128個值续膳,相比起來bitmap算是string更底層的處理方式。不過需要注意的是無論是bitmap還是string收班,他們在結(jié)尾都會自動補(bǔ)上“ \0 ”坟岔,用于滿足SDS格式。
? bitmap由于其操作二進(jìn)制數(shù)的特性摔桦,所以常用于bool類型的需求之中社付,如果我們用ASCII編碼存儲字符串“1”或“0”那么就需要8位二進(jìn)制(如果用utf-8、gbk的編碼方式所占的二進(jìn)制位數(shù)會更多)邻耕,但是用bitmap鸥咖,8位二進(jìn)制就可以存儲8個“1”或“0”。顯然在這種特定的數(shù)據(jù)存儲上bitmap能夠比string結(jié)構(gòu)剩下很多空間赊豌。
1.1 相關(guān)命令
? Redis提供了六個bitmap的相關(guān)命令:setbit扛或、getbit、bitcount碘饼、bitop熙兔、bitpos、bitfield
-
SETBIT:
SETBIT key offset value
設(shè)置或者清空key的value(字符串)在offset處的bit值艾恼。
127.0.0.1:6379[1]> SETBIT demo 3 1 # 00010000住涉,注意是從左向右數(shù) (integer) 1 127.0.0.1:6379[1]> GET demo # 得到十六進(jìn)制數(shù)據(jù) "\x10"
-
GETBIT:
GETBIT key offset
返回key對應(yīng)的string在offset處的bit值,當(dāng)offset超出了字符串長度的時候钠绍,這個字符串就被假定為由0比特填充的連續(xù)空間舆声,返回值為0。當(dāng)key不存在的時候柳爽,它就認(rèn)為是一個空字符串媳握,所以獲取到的值也為0。
127.0.0.1:6379[1]> GETBIT demo 3 (integer) 1 127.0.0.1:6379[1]> GETBIT demoo 3 (integer) 0
-
BITCOUNT:
BITCOUNT key [start end]
統(tǒng)計字符串被設(shè)置為1的bit數(shù)磷脯,可以通過設(shè)置 start 或 end 參數(shù)來指定位置蛾找。
127.0.0.1:6379[1]> SETBIT demo 9 1 (integer) 0 127.0.0.1:6379[1]> BITCOUNT demo (integer) 2 127.0.0.1:6379[1]> BITCOUNT demo 1 1 # 注意這里的start和end,是以8位二進(jìn)制為單位的赵誓。 (integer) 1 127.0.0.1:6379[1]> BITCOUNT demo 0 1 (integer) 2
-
BITOP:
BITOP operation destkey key [key ...]
對一個或多個保存二進(jìn)制位的字符串 key 進(jìn)行位元操作打毛,并將結(jié)果保存到 destkey 上柿赊。
BITOP 命令支持 AND 、 OR 幻枉、 NOT 碰声、 XOR 這四種操作中的任意一種參數(shù):
? BITOP AND destkey srckey1 srckey2 srckey3 ... srckeyN ,對一個或多個 key 求邏輯并熬甫,并將結(jié)果保存到 destkey 胰挑。
? BITOP OR destkey srckey1 srckey2 srckey3 ... srckeyN,對一個或多個 key 求邏輯或罗珍,并將結(jié)果保存到 destkey 洽腺。
? BITOP XOR destkey srckey1 srckey2 srckey3 ... srckeyN,對一個或多個 key 求邏輯異或覆旱,并將結(jié)果保存到 destkey 。
? BITOP NOT destkey srckey核无,對給定 key 求邏輯非扣唱,并將結(jié)果保存到 destkey 。
除了 NOT 操作之外团南,其他操作都可以接受一個或多個 key 作為輸入噪沙。? 執(zhí)行結(jié)果將始終保持到destkey里面。
127.0.0.1:6379[1]> set key1 'hello' OK 127.0.0.1:6379[1]> set key2 'world' OK 127.0.0.1:6379[1]> SET key1 'hello' OK 127.0.0.1:6379[1]> SET key2 'world' OK 127.0.0.1:6379[1]> BITOP OR destkey key1 key2 (integer) 5 127.0.0.1:6379[1]> GET destkey "\x7fo~lo"
-
BITPOS:
BITPOS key bit [start] [end]
返回字符串里面第一個被設(shè)置為1或者0的bit位吐根。
返回一個位置正歼,把字符串當(dāng)做一個從左到右的字節(jié)數(shù)組,第一個符合條件的在位置0拷橘,其次在位置8局义,等等。
127.0.0.1:6379[1]> BITPOS demo 1 (integer) 3
-
BITFIELD:
BITFIELD key [GET type offset] [SET type offset value] [INCRBY type offset increment] [OVERFLOW WRAP|SAT|FAIL]
本命令會把Redis字符串當(dāng)作位數(shù)組冗疮,并能對變長位寬和任意未字節(jié)對齊的指定整型位域進(jìn)行尋址萄唇。在實(shí)踐中,可以使用該命令對一個有符號的5位整型數(shù)的1234位設(shè)置指定值术幔,也可以對一個31位無符號整型數(shù)的4567位進(jìn)行取值另萤。類似地,在對指定的整數(shù)進(jìn)行自增和自減操作诅挑,本命令可以提供有保證的四敞、可配置的上溢和下溢處理操作。
BITFIELD命令能操作多字節(jié)位域拔妥,它會執(zhí)行一系列操作忿危,并返回一個響應(yīng)數(shù)組,在參數(shù)列表中每個響應(yīng)數(shù)組匹配相應(yīng)的操作毒嫡。
127.0.0.1:6379[1]> BITFIELD demo INCRBY i5 100 1 GET u4 0 1) (integer) 1 2) (integer) 1