欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于Redis分布式BitMap的應用分析

 更新時間:2022年03月04日 17:08:58   作者:Java知識圖譜  
這篇文章主要介紹了基于Redis分布式BitMap的應用,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

一、序言

在實際開發(fā)中常常遇到如下需求:判斷當前元素是否存在于已知的集合中,將已知集合中的元素維護一個HashSet,使用時只需耗時O(1)的時間復雜度便可判斷出結果,Java內部或者Redis均提供相應的數(shù)據(jù)結構。使用此種方式除了占用內存空間外,幾乎沒有其它缺點。

當數(shù)據(jù)量達到億級別時,內存空間的占用顯著表現(xiàn)出來,BitMap便是解決此類問題的一種途徑。

二、BitMap結構

1、內存消耗分析

Redis BitMap能夠存儲的數(shù)據(jù)范圍為[0,2^32-1],超過Integer.MAX_VALUE上界值。

為了簡化討論,假設討論的集合元素的范圍為[0,Integer.MAX_VALUE],可以是其中的任何一個數(shù)。

使用HashSet數(shù)據(jù)結構占用內存空間僅與集合中的元素數(shù)量(N)相關。當集合中元素數(shù)量為N時,所需的內存空間大概為N*4/1024/1024MB,1億條數(shù)據(jù)約占內存空間381MB。

基于Redis的BitMap所占用的空間大小不與集合中元素數(shù)量相關,與集合中元素的最大值直接相關,因此BitMap所占用的內存空間范圍為[N / 8 / 1024 / 1024,Integer.MAX_VALUE / 8 / 1024 / 1024]。

// 測試1億、5億、10億、Integer.MAX_VALUE
List<Integer> items = Arrays.asList(100000000, 500000000, 1000000000, Integer.MAX_VALUE);
for (Integer item : items) {
    int size = item / 8 / 1024 / 1024;
    System.out.printf("如果集合中最大值為%-10s,則所占用的內存空間為%3sMB%n",item, size);
}

這里給出了一組測試參考數(shù)據(jù)

如果集合中最大值為100000000 ,則所占用的內存空間為 11MB
如果集合中最大值為500000000 ,則所占用的內存空間為 59MB
如果集合中最大值為1000000000,則所占用的內存空間為119MB
如果集合中最大值為2147483647,則所占用的內存空間為255MB

當集合中數(shù)據(jù)增長到10億條時,使用BItMap最大占用內存約為255MB,而使用HashSet增長到3.8GB。

2、命令行操作BitMap

使用Redis命令行可直接操作BitMap,將offset位置的值標注為1,則表示當前數(shù)據(jù)存在。默認情況下未標注的位置值為0。

# 默認位不賦值為0,當數(shù)據(jù)存在于集合中,將對應位賦值為1
SETBIT key offset value
# 查看對應位數(shù)據(jù)是否存在(1表示存在,0表示不存在)
GETBIT key offset

3、客戶端操作BitMap

這里提供一個SpringBoot生態(tài)的RedisUtils工具類,內部封裝操作Redis BitMap的工具方法。

// 將當前位置標記為true
RedisUtils.setBit(BIT_MAP_KEY, orderId, true);
// 獲取指定位置的值(對應數(shù)值是否存在)
RedisUtils.getBit(BIT_MAP_KEY, orderId)

上述工具類的依賴如下,如果找不到Jar包,請直接使用Maven原始倉庫源,阿里云尚未同步完成。

<dependency>
    <groupId>xin.altitude.cms</groupId>
    <artifactId>ucode-cms-common</artifactId>
    <version>1.4.3</version>
</dependency>

4、時間與空間復雜度

BitMap的存儲與取值時間復雜度為O(1),根據(jù)數(shù)值可直接映射下標。

BitMap占用內存空間復雜度為O(n),與集合中元素的最大值正相關,不是集合中元素的數(shù)量。

三、BitMap應用

1、回避緩存穿透

緩存穿透是指當前請求的數(shù)據(jù)在緩存中不存在,需要訪問數(shù)據(jù)庫獲取數(shù)據(jù)(數(shù)據(jù)庫中也不存在請求的數(shù)據(jù))。緩存穿透給數(shù)據(jù)庫帶來了壓力,惡意緩存穿透甚至能造成數(shù)據(jù)庫宕機。

使用BitMap動態(tài)維護一個集合,當訪問數(shù)據(jù)庫前,先查詢數(shù)據(jù)的主鍵是否存在集合中,以此作為是否訪問數(shù)據(jù)庫的依據(jù)。

BitMap新增數(shù)據(jù)或者移除數(shù)據(jù)屬于輕量級操作,檢查操作的準確度依賴于動態(tài)集合維護的閉環(huán)的完整性。比如向數(shù)據(jù)庫增加數(shù)據(jù)時需要向BitMap中添加數(shù)據(jù),從數(shù)據(jù)庫中刪除數(shù)據(jù)需要從BitMap中移除數(shù)據(jù)。如果要求嚴格的檢查可靠性,則可以單獨維護一個分布式定時任務,定期更新BitMap數(shù)據(jù)。

2、與布隆過濾器的區(qū)別

布隆過濾器與BitMap有相似的應用場景,但也有一定的區(qū)別。給定一個數(shù),BitMap能準確知道是否存在于已知集合中;布隆過濾器能準確判斷是否不在集合中,卻不能肯定存在于集合中。

BitMap增加或者移除數(shù)據(jù)時間復雜度為O(1),方便快捷。布隆過濾器新建容易,剔除數(shù)據(jù)操作比較繁瑣。

在一些需要精確判斷的場景,優(yōu)先選擇BitMap,比如判斷手機號是否已經(jīng)注冊。

四、小結

Redis BitMap不是一種新的數(shù)據(jù)結構,是利用字符串類型做的一層封裝,看起來像一種新型數(shù)據(jù)結構。BitMap不像一種技術,更像是算法,在時間復雜度和空間復雜度之間尋找平衡點。

BitMap其它應用場景比如簽到打卡,統(tǒng)計在線人數(shù)等等。

到此這篇關于基于Redis分布式BitMap的應用的文章就介紹到這了,更多相關Redis分布式BitMap內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • redis分布式鎖的go-redis實現(xiàn)方法詳解

    redis分布式鎖的go-redis實現(xiàn)方法詳解

    這篇文章主要介紹了redis分布式鎖的go-redis實現(xiàn)方法,本文給大家介紹的非常詳細對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • Redis三種集群搭建配置(主從集群、哨兵集群、分片集群)

    Redis三種集群搭建配置(主從集群、哨兵集群、分片集群)

    本文主要介紹了Redis三種集群搭建配置,包括主從集群、哨兵集群、分片集群,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • Redis數(shù)據(jù)庫原理深入刨析

    Redis數(shù)據(jù)庫原理深入刨析

    在之前的文章我們介紹過,Redis服務器在啟動之初,會初始化RedisServer的實例,在這個實例中存在很多重要的屬性結構,同理本篇博客中介紹的數(shù)據(jù)庫實現(xiàn)原理也會和其中的某些屬性相關,我們繼續(xù)看一下吧
    2022-11-11
  • Redis中過期鍵如何刪除示例詳解

    Redis中過期鍵如何刪除示例詳解

    因為redis數(shù)據(jù)是基于內存的,然而內存是非常寶貴的資源,然后我們就會對一些不常用或者只用一次的數(shù)據(jù)進行存活時間設置,這樣才能提高內存的使用效率,下面這篇文章主要給大家介紹了關于Redis中過期鍵如何刪除的相關資料,需要的朋友可以參考下
    2022-04-04
  • Redis位圖bitmap操作

    Redis位圖bitmap操作

    本文主要介紹了Redis位圖bitmap操作,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • Springboot/Springcloud項目集成redis進行存取的過程解析

    Springboot/Springcloud項目集成redis進行存取的過程解析

    大家都知道Redis支持五種數(shù)據(jù)類型:string(字符串),hash(哈希),list(列表),set(集合),zset(sorted set:有序集合),本文重點給大家介紹Springboot/Springcloud項目集成redis進行存取的過程,需要的朋友參考下吧
    2021-12-12
  • redis?key鍵過期刪除策略及淘汰機制探究

    redis?key鍵過期刪除策略及淘汰機制探究

    這篇文章主要為大家介紹了redis?key鍵過期刪除策略及淘汰機制探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • redis 查看所有的key方式

    redis 查看所有的key方式

    這篇文章主要介紹了redis 查看所有的key方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • 解析Redis Cluster原理

    解析Redis Cluster原理

    redis最開始使用主從模式做集群,若master宕機需要手動配置slave轉為master;后來為了高可用提出來哨兵模式,該模式下有一個哨兵監(jiān)視master和slave,若master宕機可自動將slave轉為master,但它也有一個問題,就是不能動態(tài)擴充;所以在3.x提出cluster集群模式
    2021-06-06
  • dubbo服務使用redis注冊中心的系列異常解決

    dubbo服務使用redis注冊中心的系列異常解決

    這篇文章主要為大家介紹了dubbo服務在使用redis注冊中心遇到的一系列異常的解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-03-03

最新評論