婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 淺談Redis位圖(Bitmap)及Redis二進(jìn)制中的問題

淺談Redis位圖(Bitmap)及Redis二進(jìn)制中的問題

熱門標(biāo)簽:貴州電銷卡外呼系統(tǒng) 日本中國地圖標(biāo)注 十堰營銷電銷機(jī)器人哪家便宜 宿遷便宜外呼系統(tǒng)平臺 魔獸2青云地圖標(biāo)注 鄭州人工智能電銷機(jī)器人系統(tǒng) 山東外呼銷售系統(tǒng)招商 北京400電話辦理收費(fèi)標(biāo)準(zhǔn) 超呼電話機(jī)器人

Redis位圖(Bitmap)及二進(jìn)制的問題

SETBIT key offset value

對 key 所儲存的字符串值,設(shè)置或清除指定偏移量上的位(bit)。位的設(shè)置或清除取決于 value 參數(shù),可以是 0 也可以是 1 。當(dāng) key 不存在時,自動生成一個新的字符串值。字符串會進(jìn)行伸展(grown)以確保它可以將 value 保存在指定的偏移量上。當(dāng)字符串值進(jìn)行伸展時,空白位置以 0 填充。offset 參數(shù)必須大于或等于 0 ,小于 2^32 (bit 映射被限制在 512 MB 之內(nèi))。返回值是指定偏移量原來存儲的位

對使用大的 offset 的 SETBIT 操作來說,內(nèi)存分配可能造成 Redis 服務(wù)器被阻塞。具體參考 SETRANGE 命令,warning(警告)部分。

127.0.0.1:6379> setbit bit 3 1
(integer) 0
127.0.0.1:6379> getbit bit 0
(integer) 0
127.0.0.1:6379> getbit bit 1
(integer) 0
127.0.0.1:6379> getbit bit 2
(integer) 0
127.0.0.1:6379> getbit bit 3
(integer) 1127.0.0.1:6379> setbit bit 3 0(integer) 1

GETBIT key offset

返回key對應(yīng)的string在offset處的bit值,當(dāng)offset超出了字符串長度的時候,這個字符串就被假定為由0比特填充的連續(xù)空間。當(dāng)key不存在的時候,它就認(rèn)為是一個空字符串,所以offset總是超出范圍,然后value也被認(rèn)為是由0比特填充的連續(xù)空間。到內(nèi)存分配。

127.0.0.1:6379> getbit yhq 5
(integer) 0
127.0.0.1:6379> getbit bit 10
(integer) 0
127.0.0.1:6379> getbit bit 3
(integer) 1

BITCOUNT key [start] [end]

計(jì)算給定字符串中,被設(shè)置為 1 的比特位的數(shù)量。一般情況下,給定的整個字符串都會被進(jìn)行計(jì)數(shù),通過指定額外的 start 或 end 參數(shù),可以讓計(jì)數(shù)只在特定的位上進(jìn)行*start和end的單元是字節(jié)而不是bit*。start 和 end 參數(shù)的設(shè)置和 GETRANGE 命令類似,都可以使用負(fù)數(shù)值:比如 -1 表示最后一個位,而 -2 表示倒數(shù)第二個位,以此類推。不存在的 key 被當(dāng)成是空字符串來處理,因此對一個不存在的 key 進(jìn)行 BITCOUNT 操作,結(jié)果為 0 。

127.0.0.1:6379> set mykey foobar
OK
127.0.0.1:6379> bitcount youkey
(integer) 0
127.0.0.1:6379> bitcount mykey
(integer) 26
127.0.0.1:6379> bitcount mykey 0 0   # "f" 0110 0110
(integer) 4
127.0.0.1:6379> bitcount mykey 1 1   # "o" 0110 1111
(integer) 6

BITOP operation destkey key [key ...]

對一個或多個保存二進(jìn)制位的字符串 key 進(jìn)行位元操作,并將結(jié)果保存到 destkey 上。

operation 可以是 AND 、 OR 、 NOT 、 XOR 這四種操作中的任意一種:

  • BITOP AND destkey key [key ...] ,對一個或多個 key 求邏輯與,并將結(jié)果保存到 destkey 。
  • BITOP OR destkey key [key ...] ,對一個或多個 key 求邏輯或,并將結(jié)果保存到 destkey 。
  • BITOP XOR destkey key [key ...] ,對一個或多個 key 求邏輯異或,并將結(jié)果保存到 destkey 。
  • BITOP NOT destkey key ,對給定 key 求邏輯非,并將結(jié)果保存到 destkey 。

除了 NOT 操作之外,其他操作都可以接受一個或多個 key 作為輸入。

處理不同長度的字符串,當(dāng) BITOP 處理不同長度的字符串時,較短的那個字符串所缺少的部分會被看作 0 。空的 key 也被看作是包含 0 的字符串序列

127.0.0.1:6379> setbit bit1 0 1
(integer) 0
127.0.0.1:6379> setbit bit1 3 1
(integer) 0
127.0.0.1:6379> setbit bit2 0 1
(integer) 0
127.0.0.1:6379> setbit bit2 1 1
(integer) 0
127.0.0.1:6379> setbit bit2 3 1
(integer) 0
127.0.0.1:6379> bitop and andbit bit1 bit2
(integer) 1
127.0.0.1:6379> getbit andbit 0
(integer) 1
127.0.0.1:6379> getbit andbit 1
(integer) 0
127.0.0.1:6379> getbit andbit 2
(integer) 0
127.0.0.1:6379> getbit andbit 3
(integer) 1

BITPOS key bit [start] [end]

返回字符串里面第一個被設(shè)置為1或者0的bit位。如果我們在空字符串或者0字節(jié)的字符串里面查找bit為1的內(nèi)容,那么結(jié)果將返回-1。

如果我們在字符串里面查找bit為0而且字符串只包含1的值時,將返回字符串最右邊的第一個空位。如果有一個字符串是三個字節(jié)的值為0xff的字符串,那么命令BITPOS key 0將會返回24,因?yàn)?-23位都是1。基本上,我們可以把字符串看成右邊有無數(shù)個0。然而,如果你用指定start和end范圍進(jìn)行查找指定值時,如果該范圍內(nèi)沒有對應(yīng)值,結(jié)果將返回-1。

127.0.0.1:6379> getbit num 0
(integer) 0
127.0.0.1:6379> getbit num 1
(integer) 0
127.0.0.1:6379> getbit num 2
(integer) 1
127.0.0.1:6379> getbit num 3
(integer) 1
127.0.0.1:6379> getbit num 4
(integer) 0
127.0.0.1:6379> getbit num 5
(integer) 0
127.0.0.1:6379> getbit num 6
(integer) 1
127.0.0.1:6379> getbit num 7
(integer) 0
127.0.0.1:6379> getbit num 8
(integer) 0
127.0.0.1:6379> bitpos num 1
(integer) 2
127.0.0.1:6379> bitpos yhqqhh 1
(integer) -1
127.0.0.1:6379> bitpos yhqqhh 0
(integer) 0

Redis二進(jìn)制中的問題1 : 數(shù)字全部是char類型表示

127.0.0.1:6379> set num 2
OK
127.0.0.1:6379> bitcount num
(integer) 3

Redis中,數(shù)字類型其實(shí)是以ASCII形式展現(xiàn)的,即 2=>50,正常2的(一個字節(jié)8個二進(jìn)制位)表示為 00000010,bitcount為1。而Redis數(shù)字是字符的"2",所以 "2"[50] 的表示為 00110010,bitcount為3。

Redis中二進(jìn)制從左到右(正常從右到左)

"2"的二進(jìn)制為 00110010

127.0.0.1:6379> getbit num 0
(integer) 0
127.0.0.1:6379> getbit num 1
(integer) 0
127.0.0.1:6379> getbit num 2
(integer) 1
127.0.0.1:6379> getbit num 3
(integer) 1
127.0.0.1:6379> getbit num 4
(integer) 0
127.0.0.1:6379> getbit num 5
(integer) 0
127.0.0.1:6379> getbit num 6
(integer) 1
127.0.0.1:6379> getbit num 7
(integer) 0

redis高級數(shù)據(jù)結(jié)構(gòu)---bitmap

場景引入

我們在正常開發(fā)環(huán)境中,有時候需要將bool型數(shù)據(jù)進(jìn)行存取,比如用戶一年里面簽到了多少次,簽到了設(shè)置1,沒簽到設(shè)置0,要記錄365天,如果使用普通的key/value形式存儲,每個用戶就需要占據(jù)365鍵值對,當(dāng)用戶量上億的時候,需要驚人的存儲空間。更何況是一年的。 為了解決這種問題,redis提出了bitmap的數(shù)據(jù)結(jié)構(gòu),這樣每天用戶簽到只需要占據(jù)一個位,365天就是365位,46個字節(jié),一個稍微長一點(diǎn)的字符串就可以完全容納下一個用戶一年的簽到記錄,大量的節(jié)省存儲空間。位圖的最小單位是比特(bit),每個bit的取值只能是0或1。

實(shí)現(xiàn)原理

位圖不是特殊的數(shù)據(jù)結(jié)構(gòu),他的內(nèi)容實(shí)際就是普通的字符串,也就是byte數(shù)組,我們可以使用普通的get/set直接獲取和設(shè)置整個位圖的內(nèi)容,也可以使用位圖操作getbit/setbit等將byte數(shù)組看成位數(shù)組來處理。

基本用法

redis的位數(shù)組是自動擴(kuò)展的,如果設(shè)置了某個偏移位置超出了現(xiàn)有的內(nèi)容范圍,就會自動將位數(shù)組進(jìn)行零擴(kuò)充。

舉例:

“h”的ASCII碼值是:01101000

"e"的ASCII碼值是: 01100101

"l"的ASCII碼值是:0110 1100

"o"的ASCII碼值是:0110 1111

將“he” 連起來是:0110100001100101

即1,2,4,9,10,13,15位為1

以上的示范可以稱之為“零存整取”,即使用單個位操作設(shè)置位值,使用單個位操作獲取具體位值。

還有另一種操作稱之為“整存零取”,即使用字符串操作批量設(shè)置值,使用單個位操作獲取具體位值。

以上介紹了setbit,getbit的操作,redis還提供了位圖的統(tǒng)計(jì)和查找指令:bitcount,bitpos

bitcount同來統(tǒng)計(jì)指定位值范圍內(nèi)1的個數(shù)。

bitpos用來查找指定范圍內(nèi)出現(xiàn)的第一個0或者1。

127.0.0.1:6379> set w hello
OK
127.0.0.1:6379> bitcount w    //統(tǒng)計(jì)所有的1的個數(shù)
(integer) 21
127.0.0.1:6379> bitcount w 0 0  //統(tǒng)計(jì)第一個字符中1的個數(shù)
(integer) 3
127.0.0.1:6379> bitcount w 0 1  //統(tǒng)計(jì)前兩個字符中1的個數(shù)
(integer) 7
127.0.0.1:6379> bitpos w 0   //第一個0位
(integer) 0
127.0.0.1:6379> bitpos w 1  //第一個1位
(integer) 1
127.0.0.1:6379> bitpos w 1 1 1   // 從第二個字符算起,第一個1位
(integer) 9
127.0.0.1:6379> bitpos w 1 2 2   //  從第三個字符算起,第一個1位
(integer) 17
127.0.0.1:6379> 

接下來介紹魔術(shù)指令 bitfield:

主要解決setbit/getbit只能操作單個位的弊端。redis 3.2+新增功能。

bitfield有三個子指令:get、set、incrby,他們都可以對指定位片段進(jìn)行讀寫,但是最多只能處理64個連續(xù)的位,如果超過64位,就得使用多個子指令,bitfield可以一次執(zhí)行多個子指令。

127.0.0.1:6379> set w hello
OK
127.0.0.1:6379> bitfield w get u4 0  //從第一個位開始取4個位,結(jié)果是無符號數(shù)(u)
1) (integer) 6
127.0.0.1:6379> bitfield w get u3 2  //從第三個位開始取3個位,結(jié)果是無符號數(shù)
1) (integer) 5
127.0.0.1:6379> bitfield w get i4 0  //從第一個位開始取4個位,結(jié)果是有符號數(shù)  (i)
1) (integer) 6
127.0.0.1:6379> bitfield w get i3 2  //從第三個位開始取3個位,結(jié)果是有符號數(shù)
1) (integer) -3
127.0.0.1:6379> 

所謂有符號數(shù)是指獲取的位數(shù)組中第一個位是符號位,剩下的才是值,如果第一個位是1,那就是負(fù)數(shù)。

無符號數(shù)表示非負(fù)數(shù),沒有符號位,獲取的位數(shù)全部是是值。

有符號數(shù)最多可以獲取64位,無符號數(shù)只能獲取63位。如果超出限制,redis會報(bào)參數(shù)錯誤。

接下來演示一個多指令:

127.0.0.1:6379> bitfield w get u4 0 get u3 2 get i4 0 get i3 2
1) (integer) 6
2) (integer) 5
3) (integer) 6
4) (integer) -3
127.0.0.1:6379> 

接下來使用set子指令將第二個字符e,改成a,a的ASCII值是97

127.0.0.1:6379> bitfield w set u8 8 97
1) (integer) 101
127.0.0.1:6379> get w
"hallo"
127.0.0.1:6379> 

接下來介紹第三個子指令incrby,他用來對指定范圍的位進(jìn)行自增操作,既然是自增操作,就會存在溢出的情況,如果增加了正數(shù),會出現(xiàn)向上溢出,如果是增加了負(fù)數(shù),就會出現(xiàn)向下溢出。redis的默認(rèn)處理方式是折返操作,如果出現(xiàn)了溢出,就將溢出的符號位丟掉。如果是8位無符號數(shù)255,加1后就會溢出,會全部變?yōu)?.如果是8位有符號數(shù)127,加1后就會溢出變成-128。

127.0.0.1:6379> set w hello
OK
127.0.0.1:6379> bitfield w incrby u4 2 1   //從第三個位開始,對接下來的4位無符號數(shù)進(jìn)行自增+1
1) (integer) 11
127.0.0.1:6379> bitfield w incrby u4 2 1 
1) (integer) 12
127.0.0.1:6379> bitfield w incrby u4 2 1 
1) (integer) 13
127.0.0.1:6379> bitfield w incrby u4 2 1 
1) (integer) 14
127.0.0.1:6379> bitfield w incrby u4 2 1 
1) (integer) 15
127.0.0.1:6379> bitfield w incrby u4 2 1   //出現(xiàn)了溢出折返現(xiàn)象
1) (integer) 0
127.0.0.1:6379> 

bitfield指令提供了溢出策略子指令overflow,用戶可以選擇溢出行為,默認(rèn)是折返(wrap),還可以選擇失敗(fail)------報(bào)錯不執(zhí)行,以及飽和截?cái)啵╯at)-----超過了范圍就停留在最大值或者最小值。overflow指令只影響接下來的第一條指令,這條指令執(zhí)行完后溢出策略會變成默認(rèn)值折返。

飽和截?cái)啵?/p>

127.0.0.1:6379> set w hello
OK
127.0.0.1:6379> bitfield w overflow sat incrby u4 2 1
1) (integer) 11
127.0.0.1:6379> bitfield w overflow sat incrby u4 2 1
1) (integer) 12
127.0.0.1:6379> bitfield w overflow sat incrby u4 2 1
1) (integer) 13
127.0.0.1:6379> bitfield w overflow sat incrby u4 2 1
1) (integer) 14
127.0.0.1:6379> bitfield w overflow sat incrby u4 2 1
1) (integer) 15
127.0.0.1:6379> bitfield w overflow sat incrby u4 2 1   //出現(xiàn)飽和截?cái)啵3肿畲笾?
1) (integer) 15
127.0.0.1:6379> 

失敗不執(zhí)行:

127.0.0.1:6379> set w hello
OK
127.0.0.1:6379> bitfield w overflow fail incrby u4 2 1
1) (integer) 11
127.0.0.1:6379> bitfield w overflow fail incrby u4 2 1
1) (integer) 12
127.0.0.1:6379> bitfield w overflow fail incrby u4 2 1
1) (integer) 13
127.0.0.1:6379> bitfield w overflow fail incrby u4 2 1
1) (integer) 14
127.0.0.1:6379> bitfield w overflow fail incrby u4 2 1
1) (integer) 15
127.0.0.1:6379> bitfield w overflow fail incrby u4 2 1   //不執(zhí)行
1) (nil)
127.0.0.1:6379> 

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • Redis中3種特殊的數(shù)據(jù)類型(BitMap、Geo和HyperLogLog)
  • redis通過位圖法記錄在線用戶的狀態(tài)詳解
  • Redis基于Bitmap實(shí)現(xiàn)用戶簽到功能
  • Redis高級數(shù)據(jù)類型Hyperloglog、Bitmap的使用

標(biāo)簽:吉安 朝陽 果洛 江蘇 大慶 臺州 北京 楊凌

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《淺談Redis位圖(Bitmap)及Redis二進(jìn)制中的問題》,本文關(guān)鍵詞  淺談,Redis,位圖,Bitmap,及,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《淺談Redis位圖(Bitmap)及Redis二進(jìn)制中的問題》相關(guān)的同類信息!
  • 本頁收集關(guān)于淺談Redis位圖(Bitmap)及Redis二進(jìn)制中的問題的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    亚洲激情自拍视频| 制服丝袜成人动漫| 日本电影亚洲天堂一区| 国产欧美日本一区二区三区| 丝袜亚洲另类欧美| 在线视频你懂得一区二区三区| 91精品国产福利在线观看| 国产精品每日更新| 99视频精品免费视频| 国产人妖乱国产精品人妖| av日韩在线网站| 亚洲成人在线网站| 欧美不卡一区二区三区四区| 久久精品国产在热久久| 日韩三级av在线播放| 国产乱淫av一区二区三区| 久久日韩粉嫩一区二区三区| 国产jizzjizz一区二区| 亚洲美腿欧美偷拍| 欧美三级电影一区| 国产91高潮流白浆在线麻豆 | 91蜜桃视频在线| 亚洲电影一区二区三区| 911精品国产一区二区在线| 精品一二线国产| 亚洲国产cao| 国产精品国产三级国产aⅴ中文| 欧美日韩高清不卡| 粉嫩绯色av一区二区在线观看| 亚洲国产精品久久人人爱蜜臀| 久久久五月婷婷| 日韩欧美在线不卡| 制服丝袜亚洲精品中文字幕| 色综合天天综合网天天看片| 成人毛片在线观看| 国产91精品免费| 成人免费视频caoporn| 国产美女视频91| 高清日韩电视剧大全免费| 国产精品一区二区在线观看不卡 | 亚洲精品视频免费看| 国产片一区二区三区| 欧美精品一区二区三| 5858s免费视频成人| 一本大道综合伊人精品热热| 国产精品自拍网站| 久久av老司机精品网站导航| 日韩一区欧美二区| 激情综合一区二区三区| 狠狠色狠狠色综合日日91app| 国产一区二区中文字幕| 成人亚洲一区二区一| 五月婷婷欧美视频| 亚洲一区二区欧美日韩 | 免费一区二区视频| 国产盗摄视频一区二区三区| 成人av动漫网站| 欧美日韩高清在线播放| 精品99999| 天堂va蜜桃一区二区三区| 久久国产生活片100| 色婷婷av一区二区三区大白胸| 欧美日韩三级视频| 亚洲欧美怡红院| 亚洲国产人成综合网站| 精品一区二区在线播放| 99re成人精品视频| 日韩午夜激情电影| 亚洲午夜视频在线| eeuss影院一区二区三区| 欧美精品视频www在线观看| 国产亚洲一区二区三区在线观看| 亚洲男人的天堂在线观看| 九色综合狠狠综合久久| 在线成人免费观看| 亚洲午夜精品在线| 色偷偷88欧美精品久久久| 欧美国产亚洲另类动漫| 国产精品自拍av| 欧美国产日韩亚洲一区| 九九视频精品免费| 日韩一卡二卡三卡四卡| 日韩精品电影一区亚洲| 99精品欧美一区二区三区小说| 久久精品一区二区| www.亚洲激情.com| 国产精品毛片高清在线完整版| 国产成人av电影在线| 国产精品久久久久久久久免费丝袜 | 国产精品麻豆久久久| 风间由美一区二区三区在线观看 | 国产成人精品免费一区二区| 国产欧美日韩三区| 成人永久aaa| 天堂久久久久va久久久久| 日韩一卡二卡三卡国产欧美| 激情六月婷婷综合| 亚洲欧美日韩在线| 日韩精品自拍偷拍| 色伊人久久综合中文字幕| 青青草原综合久久大伊人精品优势| 91精品午夜视频| 色婷婷国产精品久久包臀| 国产老肥熟一区二区三区| 亚洲福利视频一区| 中文一区二区完整视频在线观看| 欧美一区二区三区在线观看 | 99亚偷拍自图区亚洲| 亚洲成人777| 亚洲精品v日韩精品| 中文字幕的久久| 国产欧美日韩在线| 日本一区二区三区高清不卡| 精品日韩在线观看| 91精品国产综合久久福利软件| 91精品福利视频| 一本大道综合伊人精品热热| 丁香婷婷综合色啪| 国产99精品国产| 成人国产一区二区三区精品| 成人污污视频在线观看| 成人动漫中文字幕| 日本高清不卡aⅴ免费网站| 91在线播放网址| 欧美日韩在线综合| 欧美精品第一页| 国产人成一区二区三区影院| 亚洲日本va午夜在线影院| 一级日本不卡的影视| 亚洲成年人影院| 国产麻豆9l精品三级站| 99精品视频一区| 日韩午夜电影在线观看| 国产精品蜜臀在线观看| 爽好久久久欧美精品| 国产一区二区精品在线观看| 97久久精品人人澡人人爽| 欧美精品久久久久久久久老牛影院| 26uuu精品一区二区三区四区在线 26uuu精品一区二区在线观看 | 一区二区三区在线视频免费 | 亚洲国产日日夜夜| 狠狠色丁香婷婷综合| 一本色道久久加勒比精品| 欧美精品1区2区| 亚洲人成网站在线| 久久99最新地址| 91麻豆精品国产91久久久久久| 国产精品理伦片| 美女视频黄久久| 7777精品伊人久久久大香线蕉最新版| 国产日韩欧美在线一区| 蜜臀av性久久久久蜜臀aⅴ| 在线免费观看日本欧美| 国产日产欧产精品推荐色| 精品系列免费在线观看| 这里是久久伊人| 一区二区三区美女| 欧洲亚洲精品在线| 亚洲最新在线观看| 欧美日韩一级黄| 亚洲国产三级在线| 99国产欧美久久久精品| 亚洲天堂免费看| 欧洲精品在线观看| 亚洲综合在线五月| 欧美精品乱码久久久久久| 亚洲成人免费视频| 欧美日产在线观看| 精品在线播放午夜| 久久久国产综合精品女国产盗摄| 免费日韩伦理电影| 久久久久九九视频| 色综合天天性综合| 亚洲午夜三级在线| 91麻豆精品国产无毒不卡在线观看| 美女视频黄 久久| 久久久99免费| 欧美日韩国产不卡| 国产成人综合亚洲91猫咪| 亚洲自拍偷拍欧美| 国产精品看片你懂得| 亚洲精品一区二区三区香蕉| 欧美自拍偷拍午夜视频| 91在线观看成人| 国产精品一区二区三区网站| 经典三级一区二区| 青草国产精品久久久久久| 亚洲同性同志一二三专区| 久久久精品免费观看| 日韩欧美一区在线| 欧美高清hd18日本| 日韩三级在线观看| 国产白丝网站精品污在线入口| 国产一区不卡在线| 无吗不卡中文字幕| 一区二区三区国产| 日日摸夜夜添夜夜添精品视频| 亚洲午夜免费视频| 亚洲精品日韩专区silk| 亚洲一级电影视频|