亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Redis 中的 BitMaps(位圖)命令詳解

 更新時(shí)間:2025年09月21日 10:09:06   作者:共飲一杯無(wú)  
Redis的Bitmaps利用字符串?dāng)?shù)據(jù)類型進(jìn)行位操作,提供getbit、setbit、bitcount等命令,適用于簽到統(tǒng)計(jì)、頻率記錄等場(chǎng)景,下面就來(lái)詳細(xì)的介紹一下使用方法

Redis提供的Bitmaps這個(gè)“數(shù)據(jù)結(jié)構(gòu)”可以實(shí)現(xiàn)對(duì)位的操作。它本身不是一種數(shù)據(jù)結(jié)構(gòu),實(shí)際上就是string(字符串)數(shù)據(jù)類型,但是它可以對(duì)字符串的位進(jìn)行操作。可以把 Bitmaps想象成一個(gè)以位為單位的數(shù)組,數(shù)組中的每個(gè)單元只能存0或者1,數(shù)組的下標(biāo)在bitmaps中叫做偏移量。單個(gè) bitmaps 的最大長(zhǎng)度是512MB,即2^32個(gè)比特位。

現(xiàn)代計(jì)算機(jī)用二進(jìn)制位作為信息的基礎(chǔ)單位,1個(gè)字節(jié)等位8位,例如 big 字符串是由3個(gè)字節(jié)組成,但實(shí)際在計(jì)算機(jī)存儲(chǔ)時(shí)將其用二進(jìn)制表示,big 分別對(duì)應(yīng)的ASCII碼分別是98、105、103,對(duì)應(yīng)的二進(jìn)制分別是01100010、01101001和01100111,如下圖:

Bitmaps本身不是一種數(shù)據(jù)類型, 實(shí)際上它就是字符串,但是它可以對(duì)字符串的位進(jìn)行操作??梢园?Bitmaps 想象成一個(gè)以位為單位的數(shù)組,數(shù)組的每個(gè)單元只能存儲(chǔ)0和1,數(shù)組的下標(biāo)在 Bitmaps 中叫做偏移量。

合理地使用位能夠有效地提高內(nèi)存使用率和開(kāi)發(fā)效率,很適合用于簽到這類場(chǎng)景。比如按月進(jìn)行存儲(chǔ),一個(gè)月最多31天,那么我們將該月用戶的簽到緩存二進(jìn)制就是 00000000000000000000000000000000,當(dāng)某天簽到將0改成1即可,而且 Redis 提供 對(duì)bitmap 的很多操作比如存儲(chǔ)、獲取、統(tǒng)計(jì)等指令,使用起來(lái)非常方便。

getbit key offset (對(duì) key 所儲(chǔ)存的字符串值,獲取指定偏移量上的位(bit)。)

獲取位圖指定索引的值:

127.0.0.1:6379> flushall
OK
127.0.0.1:6379> set hello big
OK
127.0.0.1:6379> getbit hello 0
(integer) 0
127.0.0.1:6379> getbit hello 15
(integer) 1
127.0.0.1:6379> getbit hello 10
(integer) 1

setbit key offset value(對(duì) key 所儲(chǔ)存的字符串值,設(shè)置或清除指定偏移量上的位(bit)。)

給位圖指定索引設(shè)置值,返回該索引位置的原始值:

127.0.0.1:6379> flushall
OK
127.0.0.1:6379> set hello big
OK
127.0.0.1:6379> getbit hello 7
(integer) 0
127.0.0.1:6379> setbit hello 7 1
(integer) 0
127.0.0.1:6379> getbit hello 7
(integer) 1
127.0.0.1:6379> get hello
"cig"

bitcount key [start end](計(jì)算給定字符串中,被設(shè)置為 1 的比特位的數(shù)量)

獲取位圖指定范圍(start到end,單位為字節(jié),如果不指定就是獲取全部)位值為1的個(gè)數(shù):

默認(rèn)情況下整個(gè)字符串都會(huì)被進(jìn)行計(jì)數(shù),通過(guò)指定額外的 start 或 end 參數(shù),可以讓計(jì)數(shù)只在特定的位上進(jìn)行。start、end 是指 bit 組的字節(jié)的下標(biāo)數(shù),二者皆包含。

127.0.0.1:6379> flushall
OK
127.0.0.1:6379> set hello big
OK
127.0.0.1:6379> bitcount hello
(integer) 12
127.0.0.1:6379> getbit hello 7
(integer) 0
127.0.0.1:6379> setbit hello 7 1
(integer) 0
127.0.0.1:6379> bitcount hello 
(integer) 13
127.0.0.1:6379> bitcount hello 0 1
(integer) 8
127.0.0.1:6379> bitcount hello 0 2
(integer) 13
127.0.0.1:6379> bitcount hello 1 1
(integer) 4
127.0.0.1:6379> bitcount hello 1 2
(integer) 9
127.0.0.1:6379> bitcount hello 2 2
(integer) 5

Bitmap 對(duì)于一些特定類型的計(jì)算非常有效。假設(shè)現(xiàn)在我們希望記錄自己網(wǎng)站上的用戶的上線頻率,比如說(shuō),計(jì)算用戶 A 上線了多少天,用戶 B 上線了多少天,諸如此類,以此作為數(shù)據(jù),從而決定讓哪些用戶參加 beta 測(cè)試等活動(dòng)——這個(gè)模式可以使用SETBIT和BITCOUNT來(lái)實(shí)現(xiàn)。
比如說(shuō),每當(dāng)用戶在某一天上線的時(shí)候,我們就使用 SETBIT ,以用戶名作為 key ,將那天所代表的網(wǎng)站的上線日作為 offset 參數(shù),并將這個(gè) offset 上的為設(shè)置為 1 。舉個(gè)例子,如果今天是網(wǎng)站上線的第 100 天,而用戶 peter 在今天閱覽過(guò)網(wǎng)站,那么執(zhí)行命令SETBIT peter 100 1;如果明天 peter 也繼續(xù)閱覽網(wǎng)站,那么執(zhí)行命令SETBIT peter 101 1,以此類推。
當(dāng)要計(jì)算 peter 總共以來(lái)的上線次數(shù)時(shí),就使用 BITCOUNT 命令:執(zhí)行BITCOUNT peter,得出的結(jié)果就是 peter 上線的總天數(shù)。
前面的上線次數(shù)統(tǒng)計(jì)例子,即使運(yùn)行 10 年,占用的空間也只是每個(gè)用戶 10*365 比特位(bit),也即是每個(gè)用戶 456 字節(jié)。對(duì)于這種大小的數(shù)據(jù)來(lái)說(shuō), BITCOUNT 的處理速度就像 GET 和 INCR 這種 O(1)復(fù)雜度的操作一樣快。
如果你的 bitmap 數(shù)據(jù)非常大,那么可以考慮使用以下兩種方法:

  1. 將一個(gè)大的 bitmap 分散到不同的 key 中,作為小的 bitmap 來(lái)處理。使用 Lua 腳本可以很方便地完成這一工作。
  2. 使用 BITCOUNT 的 start 和 end 參數(shù),每次只對(duì)所需的部分位進(jìn)行計(jì)算,將位的累積工作(accumulating)放到客戶端進(jìn)行,并且對(duì)結(jié)果進(jìn)行緩存(caching)。

還有對(duì)于一些簽到統(tǒng)計(jì)場(chǎng)景也一樣非常有效,占用空間又小。

bitop and|or|not|xor destkey key [key…] (對(duì)一個(gè)或多個(gè)保存二進(jìn)制位的字符串 key 進(jìn)行位元操作,并將結(jié)果保存到 destkey 上。)

做多個(gè)bitmap的and(交集)、or(并集)、not(非)、xor(異或)操作并將結(jié)果保存到 destkey 中:
語(yǔ)法:BITOP operation destkey key[key ...]
operation 可以是 AND 、 OR 、 NOT 、 XOR 這四種操作中的任意一種:

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

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

127.0.0.1:6379> flushall
OK
127.0.0.1:6379> set hello big
OK
127.0.0.1:6379> set world big
OK
127.0.0.1:6379> bitop and destkey hello world
(integer) 3
127.0.0.1:6379> bitop or destkey hello world
(integer) 3
127.0.0.1:6379> get destkey
"big"
127.0.0.1:6379> bitop not destkey hello
(integer) 3
127.0.0.1:6379> get destkey
"\x9d\x96\x98"
127.0.0.1:6379> bitop xor destkey hello world
(integer) 3
127.0.0.1:6379> get destkey
"\x00\x00\x00"

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

bitpos key bit [start] [end] (返回位圖中第一個(gè)值為 bit 的二進(jìn)制位的位置)

返回字符串里面第一個(gè)被設(shè)置為1或者0的bit位:

默認(rèn)情況下整個(gè)字符串都會(huì)被檢索一次,只有在指定start和end參數(shù)(指定start和end位是可行的),該范圍被解釋為一個(gè)字節(jié)的范圍,而不是一系列的位。所以start=0 并且 end=2是指前三個(gè)字節(jié)范圍內(nèi)查找。

127.0.0.1:6379> flushall
OK
127.0.0.1:6379> set hello big
OK
127.0.0.1:6379> bitpos hello 1
(integer) 1
# 查找字符串里面bit值為0的位置
127.0.0.1:6379> bitpos hello 0
(integer) 0
# 從第1個(gè)字節(jié)開(kāi)始的位置,查找字符串里面bit值為0的位置
127.0.0.1:6379> bitpos hello 0 1
(integer) 8
# 第2個(gè)字節(jié)開(kāi)始的位置,查找字符串里面bit值為1的位置 
127.0.0.1:6379> bitpos hello 1 2
(integer) 17
# 第0個(gè)字節(jié)開(kāi)始到第1個(gè)字節(jié)結(jié)束的位置,查找字符串里面bit值為1的位置
127.0.0.1:6379> bitpos hello 1 0 1
(integer) 1

BITFIELD key [GET type offset] [SET type offset value] [INCRBY type offset increment] [OVERFLOW WRAP|SAT|FAIL] (該命令將 Redis 字符串視為一個(gè)位數(shù)組,并且能夠處理具有不同位寬和任意非(必要)對(duì)齊偏移量的特定整數(shù)字段。)

BITFIELD 命令可以將一個(gè) Redis 字符串看作是一個(gè)由二進(jìn)制位組成的數(shù)組, 并對(duì)這個(gè)數(shù)組中儲(chǔ)存的長(zhǎng)度不同的整數(shù)進(jìn)行訪問(wèn) (被儲(chǔ)存的整數(shù)無(wú)需進(jìn)行對(duì)齊)。 換句話說(shuō), 通過(guò)這個(gè)命令, 用戶可以執(zhí)行諸如 “對(duì)偏移量 1234 上的 5 位長(zhǎng)有符號(hào)整數(shù)進(jìn)行設(shè)置”、 “獲取偏移量 4567 上的 31 位長(zhǎng)無(wú)符號(hào)整數(shù)”等操作。 此外, BITFIELD 命令還可以對(duì)指定的整數(shù)執(zhí)行加法操作和減法操作, 并且這些操作可以通過(guò)設(shè)置妥善地處理計(jì)算時(shí)出現(xiàn)的溢出情況。

BITFIELD 命令可以在一次調(diào)用中同時(shí)對(duì)多個(gè)位范圍進(jìn)行操作: 它接受一系列待執(zhí)行的操作作為參數(shù), 并返回一個(gè)數(shù)組作為回復(fù), 數(shù)組中的每個(gè)元素就是對(duì)應(yīng)操作的執(zhí)行結(jié)果。

一次對(duì)多個(gè)位范圍進(jìn)行操作。bitfield 有三個(gè)子指令,分別是 get/set/incrby。每個(gè)指令都可以對(duì)指定片段做操作。

子命令:GET —— 返回指定的二進(jìn)制位范圍。
bitfield key get type offset

# 類型u代表無(wú)符號(hào)十進(jìn)制,i代表帶符號(hào)十進(jìn)制
# 從偏移量offset=0開(kāi)始取3位,獲取無(wú)符號(hào)整數(shù)的值(將前3位二進(jìn)制011轉(zhuǎn)為無(wú)符號(hào)10進(jìn)制返回)
127.0.0.1:6379> bitfield hello get u3 0
1) (integer) 3
# 從偏移量offset=0開(kāi)始取4位,獲取無(wú)符號(hào)整數(shù)的值(將前4位二進(jìn)制0110轉(zhuǎn)為無(wú)符號(hào)10進(jìn)制返回)
127.0.0.1:6379> bitfield hello get u4 0
1) (integer) 6
# 從偏移量offset=0開(kāi)始取5位,獲取無(wú)符號(hào)整數(shù)的值(將前5位二進(jìn)制01100轉(zhuǎn)為無(wú)符號(hào)10進(jìn)制返回)
127.0.0.1:6379> bitfield hello get u5 0
1) (integer) 12
# 從偏移量offset=1開(kāi)始取2位,獲取無(wú)符號(hào)整數(shù)的值(11前面補(bǔ)0,就是0011,轉(zhuǎn)為無(wú)符號(hào)10進(jìn)制返回)
127.0.0.1:6379> bitfield hello get u2 1
1) (integer) 3
# 從偏移量offset=0開(kāi)始取2位,獲取帶符號(hào)整數(shù)的值(01前面補(bǔ)0,就是0001,轉(zhuǎn)為帶符號(hào)10進(jìn)制返回)
127.0.0.1:6379> bitfield hello get i2 0
1) (integer) 1

子命令:SET —— 對(duì)指定的二進(jìn)制位范圍進(jìn)行設(shè)置,并返回它的舊值。
bitfield key set type offset value

# 從偏移量offset=0開(kāi)始取3位,設(shè)置為無(wú)符號(hào)的整數(shù)5并返回舊值
127.0.0.1:6379> bitfield hello set u3 0 5
1) (integer) 3
127.0.0.1:6379> bitfield hello get u3 0
1) (integer) 5
# 從偏移量offset=0開(kāi)始取4位,設(shè)置為無(wú)符號(hào)的整數(shù)6并返回舊值
127.0.0.1:6379> bitfield hello set u4 0 6
1) (integer) 10
127.0.0.1:6379> bitfield hello get u4 0
1) (integer) 6
# 從偏移量offset=0開(kāi)始取4位,設(shè)置為帶符號(hào)的整數(shù)5并返回舊值
127.0.0.1:6379> bitfield hello set i4 0 5
1) (integer) 6
127.0.0.1:6379> bitfield hello get i4 0
1) (integer) 5

子命令:INCRBY —— 對(duì)指定的二進(jìn)制位范圍執(zhí)行加法操作,并返回它的舊值。用戶可以通過(guò)向 increment 參數(shù)傳入負(fù)值來(lái)實(shí)現(xiàn)相應(yīng)的減法操作。
bitfield key incrby type offset increment

# 從偏移量offset=0開(kāi)始取4位,獲取無(wú)符號(hào)整數(shù)的值
# 從偏移量offset=6開(kāi)始取4位,設(shè)置為無(wú)符號(hào)的整數(shù)6 
# 從偏移量offset=4開(kāi)始取4位,獲取無(wú)符號(hào)整數(shù)的值并自增1
127.0.0.1:6379> bitfield hello get u4 0 set u4 4 6 incrby u4 4 1
1) (integer) 5
2) (integer) 2
3) (integer) 7

# 從偏移量offset=0開(kāi)始取4位,獲取無(wú)符號(hào)整數(shù)的值
127.0.0.1:6379>  bitfield hello get u4 0
1) (integer) 5
# 從偏移量offset=4開(kāi)始取4位,設(shè)置為無(wú)符號(hào)整數(shù)6
127.0.0.1:6379>  bitfield hello set u4 4 6
1) (integer) 7
# 從偏移量offset=4開(kāi)始取4位,獲取無(wú)符號(hào)整數(shù)的值并自增1
127.0.0.1:6379> bitfield hello incrby u4 4 1
1) (integer) 7
# 從偏移量offset=4開(kāi)始取4位,獲取無(wú)符號(hào)整數(shù)的值
127.0.0.1:6379> bitfield hello get u4 4
1) (integer) 7
# 從偏移量offset=4開(kāi)始取4位,獲取無(wú)符號(hào)整數(shù)的值并自增1
127.0.0.1:6379> bitfield hello get u4 4 incrby u4 4 1
1) (integer) 7
2) (integer) 8
# 從偏移量offset=0開(kāi)始取4位,獲取無(wú)符號(hào)整數(shù)的值
127.0.0.1:6379> bitfield hello get u4 4
1) (integer) 8
127.0.0.1:6379>

到此這篇關(guān)于Redis 中的 BitMaps(位圖)命令詳解的文章就介紹到這了,更多相關(guān)Redis 位圖BitMaps命令內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Redis如何解決BigKey

    Redis如何解決BigKey

    在Redis的使用過(guò)程中,我們經(jīng)常會(huì)遇到BigKey, BigKey的大值會(huì)導(dǎo)致Redis內(nèi)存中產(chǎn)生大量不連續(xù)的碎片,降低內(nèi)存利用效率,本文主要介紹了Redis如何解決BigKey,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • Redis監(jiān)控工具RedisInsight安裝與使用

    Redis監(jiān)控工具RedisInsight安裝與使用

    這篇文章主要為大家介紹了Redis監(jiān)控工具RedisInsight的安裝步驟與使用方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-03-03
  • Redis 8種基本數(shù)據(jù)類型及常用命令和數(shù)據(jù)類型的應(yīng)用場(chǎng)景小結(jié)

    Redis 8種基本數(shù)據(jù)類型及常用命令和數(shù)據(jù)類型的應(yīng)用場(chǎng)景小結(jié)

    Redis是一種基于內(nèi)存操作的數(shù)據(jù)庫(kù),其中多虧于高效的數(shù)據(jù)結(jié)構(gòu),本文主要介紹了Redis 8種基本數(shù)據(jù)類型及常用命令和數(shù)據(jù)類型的應(yīng)用場(chǎng)景小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • Redis不同數(shù)據(jù)類型使用場(chǎng)景代碼實(shí)例

    Redis不同數(shù)據(jù)類型使用場(chǎng)景代碼實(shí)例

    這篇文章主要介紹了Redis不同數(shù)據(jù)類型使用場(chǎng)景代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-12-12
  • Redis RDB與AOF持久化方式詳細(xì)講解

    Redis RDB與AOF持久化方式詳細(xì)講解

    Redis是基于內(nèi)存的數(shù)據(jù)結(jié)構(gòu)服務(wù)器,保存了大量的鍵值對(duì)數(shù)據(jù),所以持久化到磁盤是非常必要的,Redis提供了兩種持久化的方式,分別是RDB和AOF。下面我們看下這兩種持久化方式的具體實(shí)現(xiàn)原理
    2022-11-11
  • redis在spring boot中異常退出的問(wèn)題解決方案

    redis在spring boot中異常退出的問(wèn)題解決方案

    這篇文章主要介紹了redis在spring boot中異常退出的問(wèn)題解決方案,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2025-05-05
  • spring?boot整合redis中間件與熱部署實(shí)現(xiàn)代碼

    spring?boot整合redis中間件與熱部署實(shí)現(xiàn)代碼

    spring?boot整合redis最常用的有三個(gè)工具庫(kù)Jedis,Redisson,Lettuce,本文重點(diǎn)介紹spring?boot整合redis中間件與熱部署實(shí)現(xiàn),需要的朋友可以參考下
    2023-01-01
  • RedisAPI原子性操作及原理解析

    RedisAPI原子性操作及原理解析

    這篇文章主要介紹了RedisAPI原子性操作及原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-12-12
  • Redis緩存雪崩、緩存擊穿、緩存穿透詳解

    Redis緩存雪崩、緩存擊穿、緩存穿透詳解

    本文介紹了緩存雪崩、擊穿、穿透三種問(wèn)題:雪崩因大量緩存同時(shí)失效導(dǎo)致數(shù)據(jù)庫(kù)壓力激增,需差異化TTL、多級(jí)緩存及熔斷機(jī)制;擊穿由熱點(diǎn)key失效引發(fā),可用互斥鎖、邏輯過(guò)期或預(yù)加載;穿透則因非法查詢穿透緩存,需布隆過(guò)濾器、空對(duì)象或參數(shù)校驗(yàn)
    2025-07-07
  • Redis過(guò)期監(jiān)聽(tīng)機(jī)制,訂單超時(shí)自動(dòng)取消方式

    Redis過(guò)期監(jiān)聽(tīng)機(jī)制,訂單超時(shí)自動(dòng)取消方式

    這篇文章主要介紹了Redis過(guò)期監(jiān)聽(tīng)機(jī)制,訂單超時(shí)自動(dòng)取消方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05

最新評(píng)論