成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

基于Redis分布式BitMap的應(yīng)用

開發(fā) 前端
在實際開發(fā)中常常遇到如下需求:判斷當(dāng)前元素是否存在于已知的集合中,將已知集合中的元素維護(hù)一個HashSet,使用時只需耗時O(1)的時間復(fù)雜度便可判斷出結(jié)果,Java內(nèi)部或者Redis均提供相應(yīng)的數(shù)據(jù)結(jié)構(gòu)。使用此種方式除了占用內(nèi)存空間外,幾乎沒有其它缺點。當(dāng)數(shù)據(jù)量達(dá)到億級別時,內(nèi)存空間的占用顯著表現(xiàn)出來,BitMap便是解決此類問題的一種途徑。

一、序言

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

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

二、BitMap結(jié)構(gòu)

1、內(nèi)存消耗分析

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

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

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

基于Redis的BitMap所占用的空間大小不與集合中元素數(shù)量相關(guān),與集合中元素的最大值直接相關(guān),因此BitMap所占用的內(nèi)存空間范圍為[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,則所占用的內(nèi)存空間為%3sMB%n",item, size);
}

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

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

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

2、命令行操作BitMap

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

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

3、客戶端操作BitMap

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

// 將當(dāng)前位置標(biāo)記為true
RedisUtils.setBit(BIT_MAP_KEY, orderId, true);
// 獲取指定位置的值(對應(yīng)數(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、時間與空間復(fù)雜度

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

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

三、BitMap應(yīng)用

1、回避緩存穿透

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

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

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

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

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

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

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

四、小結(jié)

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

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

責(zé)任編輯:未麗燕 來源: 今日頭條
相關(guān)推薦

2019-06-19 15:40:06

分布式鎖RedisJava

2021-06-03 00:02:43

RedisRedlock算法

2021-07-30 00:09:21

Redlock算法Redis

2022-03-08 07:22:48

Redis腳本分布式鎖

2017-10-24 11:28:23

Zookeeper分布式鎖架構(gòu)

2015-04-21 09:39:03

javajava分布式爬蟲

2021-10-26 19:37:15

RedisRedis應(yīng)用篇

2017-04-13 10:51:09

Consul分布式

2018-12-14 10:06:22

緩存分布式系統(tǒng)

2021-11-01 12:25:56

Redis分布式

2022-06-16 08:01:24

redis分布式鎖

2022-10-27 10:44:14

分布式Zookeeper

2021-04-15 22:02:53

區(qū)塊鏈金融比特幣

2025-05-16 08:58:47

Mongodb分布式存儲

2018-05-19 00:26:13

UAI Train分布式訓(xùn)練

2019-07-22 09:35:23

RedisSentinel

2022-01-06 10:58:07

Redis數(shù)據(jù)分布式鎖

2023-08-21 19:10:34

Redis分布式

2019-02-18 11:16:12

Redis分布式緩存

2024-01-08 08:05:08

分開部署數(shù)據(jù)體系系統(tǒng)拆分
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 亚洲精品天堂 | 毛片在线免费播放 | 成人综合视频在线观看 | 国产精品久久久久久一区二区三区 | 成人免费视频网站在线观看 | 午夜视频在线 | 欧美精品在线一区二区三区 | 免费高清av | 亚洲一区二区av在线 | 精品日韩一区二区 | 精品一区二区免费视频 | 欧美综合在线观看 | 婷婷色成人| 国产精品久久久久久 | 涩色视频在线观看 | 国产精品美女在线观看 | 精品国产一区二区在线 | 精品日韩一区二区 | 国产乱码精品一区二区三区中文 | 91婷婷韩国欧美一区二区 | 亚洲第一成年免费网站 | 国产精品久久久久久久久久久久午夜片 | 亚洲福利视频一区二区 | 国产视频一区二区 | 色婷婷综合久久久久中文一区二区 | 精品视频一区二区三区 | 国产免费一区二区三区免费视频 | 91精品国产91久久久久久三级 | 成人在线中文字幕 | 欧美一区二区三区在线 | 久久大 | 欧美a在线 | 欧美日韩电影在线 | 男人的天堂久久 | 日韩欧美一区二区在线播放 | 亚洲一区视频在线 | 美女国产一区 | 日韩成人在线观看 | 综合国产| 91精品国产乱码久久久久久久久 | 欧美精品福利 |