最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

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

getbit key offset (對 key 所儲存的字符串值,獲取指定偏移量上的位(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(對 key 所儲存的字符串值,設(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的個數(shù):

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

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

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

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

做多個bitmap的and(交集)、or(并集)、not(非)、xor(異或)操作并將結(jié)果保存到 destkey 中:
語法:BITOP operation destkey key[key ...]
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 作為輸入。

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"

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

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

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

默認(rèn)情況下整個字符串都會被檢索一次,只有在指定start和end參數(shù)(指定start和end位是可行的),該范圍被解釋為一個字節(jié)的范圍,而不是一系列的位。所以start=0 并且 end=2是指前三個字節(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個字節(jié)開始的位置,查找字符串里面bit值為0的位置
127.0.0.1:6379> bitpos hello 0 1
(integer) 8
# 第2個字節(jié)開始的位置,查找字符串里面bit值為1的位置 
127.0.0.1:6379> bitpos hello 1 2
(integer) 17
# 第0個字節(jié)開始到第1個字節(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 字符串視為一個位數(shù)組,并且能夠處理具有不同位寬和任意非(必要)對齊偏移量的特定整數(shù)字段。)

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

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

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

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

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

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

# 從偏移量offset=0開始取3位,設(shè)置為無符號的整數(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開始取4位,設(shè)置為無符號的整數(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開始取4位,設(shè)置為帶符號的整數(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 —— 對指定的二進(jìn)制位范圍執(zhí)行加法操作,并返回它的舊值。用戶可以通過向 increment 參數(shù)傳入負(fù)值來實(shí)現(xiàn)相應(yīng)的減法操作。
bitfield key incrby type offset increment

# 從偏移量offset=0開始取4位,獲取無符號整數(shù)的值
# 從偏移量offset=6開始取4位,設(shè)置為無符號的整數(shù)6 
# 從偏移量offset=4開始取4位,獲取無符號整數(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開始取4位,獲取無符號整數(shù)的值
127.0.0.1:6379>  bitfield hello get u4 0
1) (integer) 5
# 從偏移量offset=4開始取4位,設(shè)置為無符號整數(shù)6
127.0.0.1:6379>  bitfield hello set u4 4 6
1) (integer) 7
# 從偏移量offset=4開始取4位,獲取無符號整數(shù)的值并自增1
127.0.0.1:6379> bitfield hello incrby u4 4 1
1) (integer) 7
# 從偏移量offset=4開始取4位,獲取無符號整數(shù)的值
127.0.0.1:6379> bitfield hello get u4 4
1) (integer) 7
# 從偏移量offset=4開始取4位,獲取無符號整數(shù)的值并自增1
127.0.0.1:6379> bitfield hello get u4 4 incrby u4 4 1
1) (integer) 7
2) (integer) 8
# 從偏移量offset=0開始取4位,獲取無符號整數(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Redis跨主機(jī)連接超時問題的解決方案

    Redis跨主機(jī)連接超時問題的解決方案

    在微服務(wù)架構(gòu)中,服務(wù)間通信的穩(wěn)定性是系統(tǒng)可用性的重要保障,我們在近期一次線上排查中,遇到了一個 Redis 跨主機(jī)連接頻繁超時的問題,所以本文給大家分享一下Redis跨主機(jī)連接超時問題的解決方案,需要的朋友可以參考下
    2025-09-09
  • Redis基本數(shù)據(jù)類型哈希Hash常用操作命令

    Redis基本數(shù)據(jù)類型哈希Hash常用操作命令

    這篇文章主要為大家介紹了Redis基本數(shù)據(jù)類型哈希Hash常用操作,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • redis三種高可用方式部署的實(shí)現(xiàn)

    redis三種高可用方式部署的實(shí)現(xiàn)

    這篇文章主要介紹了redis三種高可用方式部署的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • Redis常用命令集的使用

    Redis常用命令集的使用

    作為一名Redis開發(fā)者或管理員,熟練掌握Redis的常用命令是必不可少的,本文主要介紹了Redis常用命令集的使用,具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-11-11
  • 淺析Redis底層數(shù)據(jù)結(jié)構(gòu)Dict

    淺析Redis底層數(shù)據(jù)結(jié)構(gòu)Dict

    Redis是一個鍵值型的數(shù)據(jù)庫,我們可以根據(jù)鍵實(shí)現(xiàn)快速的增刪改查,而鍵與值的映射關(guān)系正是通過Dict來實(shí)現(xiàn)的,當(dāng)然?Dict?也是?Set?Hash?的實(shí)現(xiàn)方式,本文就詳細(xì)帶大家介紹一下Redis底層數(shù)據(jù)結(jié)構(gòu)?Dict,,需要的朋友可以參考下
    2023-05-05
  • 詳解Redis數(shù)據(jù)類型實(shí)現(xiàn)原理

    詳解Redis數(shù)據(jù)類型實(shí)現(xiàn)原理

    這篇文章主要介紹了Redis數(shù)據(jù)類型實(shí)現(xiàn)原理,在工作中或?qū)W習(xí)中有需要的小伙伴可以參考一下這篇文章
    2021-08-08
  • redis 用scan指令 代替keys指令(詳解)

    redis 用scan指令 代替keys指令(詳解)

    下面小編就為大家分享一篇redis 用scan指令 代替keys指令詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • 爬蟲技術(shù)之分布式爬蟲架構(gòu)的講解

    爬蟲技術(shù)之分布式爬蟲架構(gòu)的講解

    今天小編就為大家分享一篇關(guān)于爬蟲技術(shù)之分布式爬蟲架構(gòu)的講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • 在Redis中如何保存時間序列數(shù)據(jù)詳解

    在Redis中如何保存時間序列數(shù)據(jù)詳解

    與發(fā)生時間相關(guān)的一組數(shù)據(jù),就是時間序列數(shù)據(jù),這些數(shù)據(jù)的特點(diǎn)是沒有嚴(yán)格的關(guān)系模型,記錄的信息可以表示成鍵和值的關(guān)系,這篇文章主要給大家介紹了關(guān)于在Redis中如何保存時間序列數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • Redis高可用-主從復(fù)制、哨兵模式與集群模式詳解

    Redis高可用-主從復(fù)制、哨兵模式與集群模式詳解

    這篇文章主要介紹了Redis高可用-主從復(fù)制、哨兵模式與集群模式的使用,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-05-05

最新評論

东兰县| 马公市| 鄂托克前旗| 隆回县| 兴和县| 渭源县| 乃东县| 海林市| 涪陵区| 衢州市| 夏津县| 博白县| 光山县| 舒兰市| 浑源县| 玛纳斯县| 泸溪县| 鄢陵县| 常州市| 南安市| 高青县| 墨江| 三江| 区。| 浮梁县| 文化| 若羌县| 铅山县| 威信县| 桐梓县| 连南| 邹城市| 沙雅县| 郓城县| 金秀| 蒲江县| 盘山县| 连山| 独山县| 清徐县| 伊川县|