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

Redis使用Bitmap的方法實(shí)現(xiàn)

 更新時(shí)間:2023年01月25日 09:35:28   作者:ikt4435  
本文主要介紹了Redis使用Bitmap的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

1. Bitmap 是什么

Bitmap(也稱為位數(shù)組或者位向量等)是一種實(shí)現(xiàn)對(duì)位的操作的'數(shù)據(jù)結(jié)構(gòu)',在數(shù)據(jù)結(jié)構(gòu)加引號(hào)主要因?yàn)椋?/p>

  • Bitmap 本身不是一種數(shù)據(jù)結(jié)構(gòu),底層實(shí)際上是字符串,可以借助字符串進(jìn)行位操作。
  • Bitmap 單獨(dú)提供了一套命令,所以與使用字符串的方法不太相同??梢园?Bitmaps 想象成一個(gè)以位為單位的數(shù)組,數(shù)組的每個(gè)單元只能存儲(chǔ) 0 和 1,數(shù)組的下標(biāo)在 Bitmap 中叫做偏移量 offset。

2. 占用存儲(chǔ)空間

如上我們知道 Bitmap 本身不是一種數(shù)據(jù)結(jié)構(gòu),底層實(shí)際上使用字符串來存儲(chǔ)。由于 Redis 中字符串的最大長(zhǎng)度是 512 MB字節(jié),所以 BitMap 的偏移量 offset 值也是有上限的,其最大值是:8 * 1024 * 1024 * 512 = 2^32。由于 C 語(yǔ)言中字符串的末尾都要存儲(chǔ)一位分隔符,所以實(shí)際上 BitMap 的偏移量 offset 值上限是:2^32-1。Bitmap 實(shí)際占用存儲(chǔ)空間取決于 BitMap 偏移量 offset 的最大值,占用字節(jié)數(shù)可以用 (max_offset / 8) + 1 公式來計(jì)算或者直接借助底層字符串函數(shù) strlen 來計(jì)算:

127.0.0.1:6379> setbit login:20220515 0 1
(integer) 0
# (0 / 8) + 1 = 1
127.0.0.1:6379> strlen login:20220515
(integer) 1
127.0.0.1:6379> setbit login:20220515 8 1
(integer) 0
# (8 / 8) + 1 = 2
127.0.0.1:6379> strlen login:20220515
(integer) 2

需要注意的是,在第一次初始化 Bitmap 時(shí),假如偏移量 offset 非常大,由于需要分配所需要的內(nèi)存,整個(gè)初始化過程執(zhí)行會(huì)比較慢,可能會(huì)造成 Redis 的阻塞。在 2010 款 MacBook Pro 上,設(shè)置第 2^32-1 位,由于需要分配 512MB 內(nèi)存,所以大約需要 300 毫秒;設(shè)置第 2^30-1 位(128 MB)大約需要 80 毫秒;設(shè)置第 2^28 -1 位(32MB)需要約 30 毫秒;設(shè)置第 2^26 -1(8MB)需要約 8 毫秒。一旦完成第一次分配,隨后對(duì)同一 key 再設(shè)置將不會(huì)產(chǎn)生分配開銷。

3. 命令

下面示例中我們將登錄 App 的用戶存放在 Bitmap 中,登錄的用戶記做 1,沒有登錄的用戶記做 0,用偏移量作為用戶的id。

3.1 SETBIT

最早可用版本:2.2.0。時(shí)間復(fù)雜度:O(1)。

語(yǔ)法格式:

SETBIT key offset value

SETBIT 用來設(shè)置 key 對(duì)應(yīng)第 offset 位的值(offset 從 0 開始算),可以設(shè)置為 0 或者 1。當(dāng)指定的 KEY 不存在時(shí),會(huì)自動(dòng)生成一個(gè)新的字符串值。字符串會(huì)進(jìn)行擴(kuò)展以確??梢詫?value 保存在指定的偏移量 offset 上。當(dāng)字符串值進(jìn)行擴(kuò)展時(shí),空白位置用 0 來填充。需要注意的是 offset 需要大于或等于 0,小于 2 的 32 次方。

假設(shè)現(xiàn)在有 10 個(gè)用戶,用戶id為 0、1、5、9 的 4 個(gè)用戶在 20220514 進(jìn)行了登錄,那么當(dāng)前 Bitmap 初始化結(jié)果如下圖所示:

具體操作過程如下,login:20220514 代表 20220514 這天所有登錄用戶的 Bitmap:

127.0.0.1:6379> setbit login:20220514 0 1
(integer) 0
127.0.0.1:6379> setbit login:20220514 1 1
(integer) 0
127.0.0.1:6379> setbit login:20220514 5 1
(integer) 0
127.0.0.1:6379> setbit login:20220514 9 1
(integer) 0

假設(shè)用戶 uid 為 15 的用戶也登錄了 App,那么 Bitmap 的結(jié)構(gòu)變成了如下圖所示,第 10 位到第 14 位都用 0 填充,第 15 位被置為 1:

很多應(yīng)用的用戶id以一個(gè)指定數(shù)字(例如 150000000000)開頭,直接將用戶id和 Bitmap 的偏移量對(duì)應(yīng)勢(shì)必會(huì)造成一定的浪費(fèi),通常的做法是每次做 setbit 操作時(shí)將用戶id減去這個(gè)指定數(shù)字。在第一次初始化 Bitmap 時(shí),假如偏移量非常大,那么整個(gè)初始化過程執(zhí)行會(huì)比較慢,可能會(huì)造成 Redis 的阻塞。

3.2 GETBIT

最早可用版本:2.2.0。時(shí)間復(fù)雜度:O(1)。

語(yǔ)法格式:

GETBIT key offset

獲取 key 對(duì)應(yīng)第 offset 位的值(offset 從 0 開始算)。當(dāng) offset 超過字符串長(zhǎng)度時(shí),字符串假定為一個(gè) 0 位的連續(xù)空間。當(dāng)指定的 key 不存在時(shí),假定為一個(gè)空字符串,offset 肯定是超出字符串長(zhǎng)度范圍,因此該值也被假定為 0 位的連續(xù)空間,都會(huì)返回 0。

下面獲取用戶id為 4 的用戶是否在 20220514 這天登錄過,返回 0 說明沒有訪問過:

127.0.0.1:6379> getbit login:20220514 4
(integer) 0

下面獲取用戶id為 5 的用戶是否在 20220514 這天登錄過,返回 1 說明訪問過:

127.0.0.1:6379> getbit login:20220514 5
(integer) 1

下面獲取用戶id為 20 的用戶是否在 20220514 這天登錄過,因?yàn)?offset 20 根本就不存在,所以返回結(jié)果也是 0:

127.0.0.1:6379> getbit login:20220514 20
(integer) 1

3.3 BITCOUNT

最早可用版本:2.6.0。時(shí)間復(fù)雜度:O(N)。

語(yǔ)法格式:

BITCOUNT key [ start end [ BYTE | BIT]]

用來計(jì)算指定 key 對(duì)應(yīng)字符串中,被設(shè)置為 1 的 bit 位的數(shù)量。一般情況下,字符串中所有 bit 位都會(huì)參與計(jì)數(shù),我們可以通過 start 或 end 參數(shù)來指定一定范圍內(nèi)被設(shè)置為 1 的 bit 位的數(shù)量。start 和 end 參數(shù)的設(shè)置和 GETRANGE 命令類似,都可以使用負(fù)數(shù):比如 -1 表示最后一個(gè)位,而 -2 表示倒數(shù)第二個(gè)位等。

從 Redis 7.0.0 開始支持 BYTE 或者 BIT 選項(xiàng)

下面計(jì)算 20220514 這天所有登錄用戶數(shù)量:

127.0.0.1:6379> bitcount login:20220514
(integer) 5

3.4 BITOP

最早可用版本:2.6.0。時(shí)間復(fù)雜度:O(N)。

語(yǔ)法格式:

BITOP operation destkey key [key ...]

BITOP 是一個(gè)復(fù)合操作,支持在多個(gè) key 之間執(zhí)行按位運(yùn)算并將結(jié)果存儲(chǔ)在 destkey 指定的 key 中。BITOP 命令支持四種按位運(yùn)算:AND(交集)、OR(并集)、XOR(異或) 和 NOT(非):

BITOP AND destkey srckey1 srckey2 srckey3 ... srckeyN
BITOP OR destkey srckey1 srckey2 srckey3 ... srckeyN
BITOP XOR destkey srckey1 srckey2 srckey3 ... srckeyN
BITOP NOT destkey srckey

如上所見,NOT 很特殊,因?yàn)樗恍枰粋€(gè)輸入 key,因?yàn)樗鼒?zhí)行位反轉(zhuǎn),因此它僅作為一元運(yùn)算符才有意義。

假設(shè) 20220513 登錄 App 的用戶id為 1、3、5、7,如下圖所示:

如果想算出 20220513 和 20220514 兩天都登錄過的用戶數(shù)量,如下圖所示:

可以使用 AND 求交集,具體命令如下:

127.0.0.1:6379> bitop and login:20220513:and:20220514 login:20220513 login:20220514
(integer) 2
127.0.0.1:6379> bitcount login:20220513:and:20220514
(integer) 2
127.0.0.1:6379> getbit login:20220513:and:20220514 1
(integer) 1
127.0.0.1:6379> getbit login:20220513:and:20220514 5
(integer) 1

如果想算出 20220513 和 20220514 任意一天登錄過 App 的用戶數(shù)量:

可以使用 OR 求并集,具體命令如下:

127.0.0.1:6379> bitop or login:20220513:or:20220514 login:20220513 login:20220514
(integer) 2
127.0.0.1:6379> bitcount login:20220513:or:20220514
(integer) 7
127.0.0.1:6379> getbit login:20220513:or:20220514 0
(integer) 1
127.0.0.1:6379> getbit login:20220513:or:20220514 1
(integer) 1

3.5 BITPOS

最早可用版本:2.8.7。時(shí)間復(fù)雜度:O(N)。

語(yǔ)法格式:

BITPOS key bit [ start [ end [ BYTE | BIT]]]

用來計(jì)算指定 key 對(duì)應(yīng)字符串中,第一位為 1 或者 0 的 offset 位置。除此之外,BITPOS 也有兩個(gè)選項(xiàng) start 和 end,跟 BITCOUNT 一樣。

BYTE、BIT 這兩個(gè)選項(xiàng)從 7.0.0 版本開始才能使用。

下面計(jì)算 20220514 登錄 App 的最小用戶id:

127.0.0.1:6379> bitpos login:20220513 1
(integer) 1

到此這篇關(guān)于Redis使用Bitmap的方法實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Redis使用Bitmap內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Redis緩存空間優(yōu)化實(shí)踐詳解

    Redis緩存空間優(yōu)化實(shí)踐詳解

    緩存Redis,是我們最常用的服務(wù),其適用場(chǎng)景廣泛,被大量應(yīng)用到各業(yè)務(wù)場(chǎng)景中。也正因如此,緩存成為了重要的硬件成本來源,我們有必要從空間上做一些優(yōu)化,降低成本的同時(shí)也會(huì)提高性能,本文通過代碼示例介紹了redis如何優(yōu)化緩存空間,需要的朋友可以參考一下
    2023-04-04
  • Redis獲取某個(gè)前綴的key腳本實(shí)例

    Redis獲取某個(gè)前綴的key腳本實(shí)例

    這篇文章主要給大家介紹了關(guān)于Redis獲取某個(gè)前綴的key腳本的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Redis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-04-04
  • 關(guān)于Redis你可能不了解的一些事

    關(guān)于Redis你可能不了解的一些事

    這篇文章主要給大家介紹了關(guān)于Redis你可能不了解的一些事,對(duì)大家學(xué)習(xí)或者使用Redis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Redis分布式鎖解決超賣問題

    Redis分布式鎖解決超賣問題

    超賣問題是典型的多線程安全問題,本文就來介紹一下Redis分布式鎖解決超賣問題,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • Redis分布式鎖如何實(shí)現(xiàn)續(xù)期

    Redis分布式鎖如何實(shí)現(xiàn)續(xù)期

    這篇文章主要介紹了Redis分布式鎖如何實(shí)現(xiàn)續(xù)期的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Redis整合Spring結(jié)合使用緩存實(shí)例

    Redis整合Spring結(jié)合使用緩存實(shí)例

    這篇文章主要介紹了Redis整合Spring結(jié)合使用緩存實(shí)例,介紹了如何在Spring中配置redis,并通過Spring中AOP的思想,將緩存的方法切入到有需要進(jìn)入緩存的類或方法前面。需要的朋友可以參考下
    2015-12-12
  • redis安裝和配置_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    redis安裝和配置_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要介紹了redis安裝和配置,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • 淺談一下Redis的緩存穿透、擊穿和雪崩

    淺談一下Redis的緩存穿透、擊穿和雪崩

    這篇文章主要介紹了淺談一下Redis緩存穿透、擊穿和雪崩,緩存穿透是指在使用緩存系統(tǒng)時(shí),頻繁查詢一個(gè)不存在于緩存中的數(shù)據(jù),導(dǎo)致這個(gè)查詢每次都要通過緩存層去查詢數(shù)據(jù)源,無法從緩存中獲得結(jié)果,需要的朋友可以參考下
    2023-08-08
  • 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
  • redis的bigkey掃描腳本深入介紹

    redis的bigkey掃描腳本深入介紹

    這篇文章主要給大家介紹了關(guān)于redis的bigkey掃描腳本的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07

最新評(píng)論

中宁县| 霍山县| 弥渡县| 泾源县| 瑞金市| 察雅县| 汝阳县| 马鞍山市| 通州市| 比如县| 精河县| 旅游| 长白| 大理市| 甘肃省| 邻水| 营山县| 项城市| 肇源县| 阳新县| 福州市| 内丘县| 丰原市| 琼结县| 安陆市| 娱乐| 英山县| 道真| 宁阳县| 四会市| 元江| 德庆县| 彰化县| 石狮市| 乌拉特后旗| 垦利县| 深州市| 安福县| 仁布县| 东辽县| 温州市|