Redis奇幻之旅(二)1. bitmap

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
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載癌蚁,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者幻梯。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市努释,隨后出現(xiàn)的幾起案子碘梢,更是在濱河造成了極大的恐慌,老刑警劉巖伐蒂,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件煞躬,死亡現(xiàn)場離奇詭異,居然都是意外死亡逸邦,警方通過查閱死者的電腦和手機(jī)恩沛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缕减,“玉大人雷客,你說我怎么就攤上這事∏沤疲” “怎么了搅裙?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長裹芝。 經(jīng)常有香客問我部逮,道長,這世上最難降的妖魔是什么嫂易? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任兄朋,我火速辦了婚禮,結(jié)果婚禮上怜械,老公的妹妹穿的比我還像新娘颅和。我一直安慰自己,他們只是感情好宫盔,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布融虽。 她就那樣靜靜地躺著,像睡著了一般灼芭。 火紅的嫁衣襯著肌膚如雪有额。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天彼绷,我揣著相機(jī)與錄音巍佑,去河邊找鬼。 笑死寄悯,一個胖子當(dāng)著我的面吹牛萤衰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播猜旬,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼脆栋,長吁一口氣:“原來是場噩夢啊……” “哼倦卖!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起椿争,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤怕膛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后秦踪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體褐捻,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年椅邓,在試婚紗的時候發(fā)現(xiàn)自己被綠了柠逞。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡景馁,死狀恐怖板壮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情合住,我是刑警寧澤个束,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站聊疲,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏沪悲。R本人自食惡果不足惜获洲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望殿如。 院中可真熱鬧贡珊,春花似錦、人聲如沸涉馁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽烤送。三九已至寒随,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間帮坚,已是汗流浹背妻往。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留试和,地道東北人讯泣。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像阅悍,于是被迫代替她去往敵國和親好渠。 傳聞我的和親對象是個殘疾皇子昨稼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內(nèi)容