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

關(guān)于Redis中bitmap的原理和使用詳解

 更新時間:2023年05月16日 10:24:22   作者:逆流°只是風(fēng)景-bjhxcc  
這篇文章主要介紹了關(guān)于Redis中bitmap的原理和使用詳解,BitMap即位圖,使用每個位表示某種狀態(tài),適合處理整型的海量數(shù)據(jù),本質(zhì)上是哈希表的一種應(yīng)用實現(xiàn),需要的朋友可以參考下

一、原理

先聲明一下:Redis 有5種數(shù)據(jù)類型,而 BitMap 在 Redis 中并不是一個新的數(shù)據(jù)類型,其底層是 Redis 實現(xiàn)。

通常情況下,我們在 redis 中存儲一個字符串,如:“big”,它的位圖如下:

在這里插入圖片描述

0.001kb = 1b = 8bit

所以,字符串“big”占3個字符,也就是24個bit位。

Redis 從 2.2.0 版本開始新增了 setbit,getbit,bitcount 等幾個 bitmap 相關(guān)命令。雖然是新命令,但是并沒有新增新的數(shù)據(jù)類型,因為 setbit 等命令只不過是在 set 上的擴展。

利用上述命令,Redis 可以操作二進制的位,可以取/改每一個位對應(yīng)的值,簡單寫幾個:

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

通過上面的例子,我們可以發(fā)現(xiàn):

  • getbit,setbit 可以對字符串進行位操作,可以獲取/修改某位上的值;
  • 字符串的位修改以后,字符串本身也發(fā)生了根本變化,big -> cig。

BitMap 原本的含義是用一個 bit 位來進行0或者1的設(shè)置,映射某個元素的狀態(tài)。

由于一個比特位只能表示 0 和 1 兩種狀態(tài),也就是說一個 bit 能存儲的最多信息量是 2,所以 BitMap 能映射的狀態(tài)有限,但是使用比特位的優(yōu)勢是能大量的節(jié)省內(nèi)存空間。

二、BitMap 相關(guān)命令

在 Redis 中,Bitmap 是一串連續(xù)的2進制數(shù)字(0或1),所以,可以把 Bitmaps 想象成一個以比特位為單位的數(shù)組,數(shù)組的每一位所在的位置為偏移(offset),數(shù)組的下標(biāo)在 Bitmaps 中叫做偏移量,在 bitmap 上可執(zhí)行AND,OR,XOR以及其它位操作。

# 設(shè)置值,其中value只能是 0 和 1
setbit key offset value
# 獲取值
getbit key offset
# 獲取指定范圍內(nèi)值為 1 的個數(shù)
# start 和 end 以字節(jié)為單位
bitcount key start end
# BitMap間的運算
# operations 位移操作符,枚舉值
  AND 與運算 &
  OR 或運算 |
  XOR 異或 ^
  NOT 取反 ~
# result 計算的結(jié)果,會存儲在該key中
# key1 … keyn 參與運算的key,可以有多個,空格分割,not運算只能一個key
# 當(dāng) BITOP 處理不同長度的字符串時,較短的那個字符串所缺少的部分會被看作 0。返回值是保存到 destkey 的字符串的長度(以字節(jié)byte為單位),和輸入 key 中最長的字符串長度相等。
bitop [operations] [result] [key1] [keyn…]
# 返回指定key中第一次出現(xiàn)指定value(0/1)的位置
bitpos [key] [value]

三、BitMap 空間計算

因為 BitMap 中的 bit 位 是 字符串的映射,字符串在 value 中的存儲是有上限的,所以 BitMap 的valu額存儲空間可以用相同的方式計算。

Redis 中字符串的最大長度是 512M,所以 BitMap 的 offset (偏移量)最大值為:

512 * 1024 * 1024 * 8 = 2^32

四、使用場景

1. 用戶簽到

很多網(wǎng)站都提供了簽到功能,并且需要展示最近一個月的簽到情況,這種情況可以使用 BitMap 來實現(xiàn)。 根據(jù)日期 offset = (今天是一年中的第幾天) % (今年的天數(shù)),key = 年份:用戶id。

如果需要將用戶的詳細簽到信息入庫的話,可以考慮使用一個一步線程來完成。

# 2021年第一天,用戶Id = userId 的用戶簽到
setbit 2021:userId 1 1

2. 統(tǒng)計活躍用戶(用戶登陸情況)

使用日期作為 key,然后用戶 id 為 offset,如果當(dāng)日活躍過就設(shè)置為1。具體怎么樣才算活躍這個標(biāo)準(zhǔn)大家可以自己指定。

假如:

  • 20220101 活躍用戶情況是: [1,0,1,1,0]
  • 20220102 活躍用戶情況是 :[ 1,1,0,1,0 ]

統(tǒng)計連續(xù)兩天活躍的用戶總數(shù):

bitop and dest1 20220101 20220102 
# dest1 中值為1的offset,就是連續(xù)兩天活躍用戶的ID
bitcount dest1

統(tǒng)計20220101 ~ 20220102 活躍過的用戶總數(shù):

bitop or dest2 20220101 20220102
# dest2 中值為1的offset,就是兩天都活躍的用戶的ID
bitcount dest2

3. 統(tǒng)計用戶在線狀態(tài)

如果需要提供一個查詢當(dāng)前用戶是否在線的接口,也可以考慮使用 BitMap ,即節(jié)約空間效率又高,只需要一個 key,然后用戶 id 為 offset,如果在線就設(shè)置為 1,不在線就設(shè)置為 0。

# userId 登錄,設(shè)置狀態(tài)為1
setbit key userId 1
# 獲取 userId 的狀態(tài):1 - 在線;0 - 不在線
getbit key userId

4. 實現(xiàn)布隆過濾器

布隆過濾器解決緩存穿透。

五、總結(jié)

  • bigmap 基于最小的單位bit進行存儲,最大優(yōu)勢是非常省空間;
  • 設(shè)置時候時間復(fù)雜度O(1)、讀取時候時間復(fù)雜度O(n),操作是非常快的;
  • 二進制數(shù)據(jù)的存儲,進行相關(guān)計算的時候非???,也能方便擴容;
  • 不要給一個很短的 bigmap 設(shè)置很長位的偏移量的值,這樣有可能堵塞。

到此這篇關(guān)于關(guān)于Redis中bitmap的原理和使用詳解的文章就介紹到這了,更多相關(guān)Redis的bitmap原理和使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Redis如何清理過期的key以及對應(yīng)的解決方法分析

    Redis如何清理過期的key以及對應(yīng)的解決方法分析

    這篇文章主要介紹了Redis如何清理過期的key以及對應(yīng)的解決方法的相關(guān)資料,Redis提供了多種過期刪除策略和內(nèi)存淘汰策略,以管理緩存和臨時數(shù)據(jù),需要的朋友可以參考下
    2025-03-03
  • springboot中redis并發(fā)鎖的等待時間設(shè)置長短的方法

    springboot中redis并發(fā)鎖的等待時間設(shè)置長短的方法

    在SpringBoot應(yīng)用中,Redis鎖的等待時間設(shè)置不當(dāng)可能導(dǎo)致資源浪費、響應(yīng)時間增加、死鎖風(fēng)險升高、系統(tǒng)負載增加、業(yè)務(wù)邏輯延遲以及故障恢復(fù)慢等問題,建議合理設(shè)置等待時間,并考慮使用其他分布式鎖實現(xiàn)方式提高性能
    2024-10-10
  • Centos7 Redis主從搭建配置的實現(xiàn)

    Centos7 Redis主從搭建配置的實現(xiàn)

    這篇文章主要介紹了Centos7 Redis主從搭建配置的實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • 通過prometheus監(jiān)控redis實時運行狀態(tài)的操作方法

    通過prometheus監(jiān)控redis實時運行狀態(tài)的操作方法

    本文詳細介紹了如何通過Prometheus監(jiān)控Redis的運行狀態(tài),包括安裝配置Redis、Redis Exporter以及Prometheus,配置Prometheus監(jiān)控Redis指標(biāo),以及常見的Redis指標(biāo)和告警規(guī)則,需要的朋友可以參考下
    2025-02-02
  • redis中的事務(wù)操作案例分析

    redis中的事務(wù)操作案例分析

    這篇文章主要介紹了redis中的事務(wù)操作案例,結(jié)合具體實例形式詳細分析了redis事務(wù)操作的概念、原理、使用技巧與相關(guān)注意事項,需要的朋友可以參考下
    2019-07-07
  • redis間歇性斷連解決方式

    redis間歇性斷連解決方式

    本文主要介紹了在使用lettuce4.2.2.Final版本作為Redis客戶端時遇到的間歇性斷連問題,具有一定的參考價值,感興趣的可以了解一下
    2025-03-03
  • 為什么RedisCluster設(shè)計成16384個槽

    為什么RedisCluster設(shè)計成16384個槽

    本文主要介紹了為什么RedisCluster設(shè)計成16384個槽,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Redis中的數(shù)據(jù)過期策略詳解

    Redis中的數(shù)據(jù)過期策略詳解

    這篇文章主要介紹了Redis中的數(shù)據(jù)過期策略,文中通過示例代碼介紹的很詳細,相信對大家的理解和學(xué)習(xí)具有一定的參考借鑒價值,有需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-01-01
  • Windows環(huán)境部署Redis集群

    Windows環(huán)境部署Redis集群

    這篇文章主要為大家詳細介紹了Windows環(huán)境部署Redis集群的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Redis如何高效刪除大key

    Redis如何高效刪除大key

    這篇文章主要介紹了Redis如何高效刪除大key問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04

最新評論

东平县| 山东| 鸡西市| 沧州市| 景德镇市| 沧源| 长子县| 陈巴尔虎旗| 界首市| 汝阳县| 团风县| 濮阳县| 双桥区| 丹寨县| 沐川县| 四川省| 五莲县| 黎城县| 巴中市| 平邑县| 张家口市| 清涧县| 渝中区| 罗定市| 开原市| 吉隆县| 韩城市| 饶平县| 磐石市| 田林县| 吕梁市| 文昌市| 宁河县| 武宣县| 宜兰县| 兖州市| 正宁县| 兴化市| 铜川市| 宁晋县| 太湖县|