国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數(shù)據(jù)庫(kù)技術(shù)|

服務(wù)器之家 - 數(shù)據(jù)庫(kù) - Redis - 基于Redis分布式BitMap的應(yīng)用分析

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

2022-03-05 20:57Java知識(shí)圖譜 Redis

這篇文章主要介紹了基于Redis分布式BitMap的應(yīng)用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

一、序言

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

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

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

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

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

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

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

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

?
1
2
3
4
5
6
// 測(cè)試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);
}

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

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

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

2、命令行操作BitMap

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

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

3、客戶端操作BitMap

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

?
1
2
3
4
// 將當(dāng)前位置標(biāo)記為true
RedisUtils.setBit(BIT_MAP_KEY, orderId, true);
// 獲取指定位置的值(對(duì)應(yīng)數(shù)值是否存在)
RedisUtils.getBit(BIT_MAP_KEY, orderId)

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

?
1
2
3
4
5
<dependency>
    <groupId>xin.altitude.cms</groupId>
    <artifactId>ucode-cms-common</artifactId>
    <version>1.4.3</version>
</dependency>

4、時(shí)間與空間復(fù)雜度

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

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

三、BitMap應(yīng)用

1、回避緩存穿透

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

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

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

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

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

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

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

四、小結(jié)

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

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

到此這篇關(guān)于基于Redis分布式BitMap的應(yīng)用的文章就介紹到這了,更多相關(guān)Redis分布式BitMap內(nèi)容請(qǐng)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

原文鏈接:https://www.cnblogs.com/javazhishitupu/archive/2022/03/04/15962910.html

延伸 · 閱讀

精彩推薦
  • Redisredis實(shí)現(xiàn)排行榜功能

    redis實(shí)現(xiàn)排行榜功能

    排行榜在很多地方都能使用到,redis的zset可以很方便地用來(lái)實(shí)現(xiàn)排行榜功能,本文就來(lái)簡(jiǎn)單的介紹一下如何使用,具有一定的參考價(jià)值,感興趣的小伙伴們...

    乘月歸5022021-08-05
  • Redis詳解Redis復(fù)制原理

    詳解Redis復(fù)制原理

    與大多數(shù)db一樣,Redis也提供了復(fù)制機(jī)制,以滿足故障恢復(fù)和負(fù)載均衡等需求。復(fù)制也是Redis高可用的基礎(chǔ),哨兵和集群都是建立在復(fù)制基礎(chǔ)上實(shí)現(xiàn)高可用的...

    李留廣10222021-08-09
  • RedisRedis如何實(shí)現(xiàn)數(shù)據(jù)庫(kù)讀寫(xiě)分離詳解

    Redis如何實(shí)現(xiàn)數(shù)據(jù)庫(kù)讀寫(xiě)分離詳解

    Redis的主從架構(gòu),能幫助我們實(shí)現(xiàn)讀多,寫(xiě)少的情況,下面這篇文章主要給大家介紹了關(guān)于Redis如何實(shí)現(xiàn)數(shù)據(jù)庫(kù)讀寫(xiě)分離的相關(guān)資料,文中通過(guò)示例代碼介紹...

    羅兵漂流記6092019-11-11
  • RedisRedis的配置、啟動(dòng)、操作和關(guān)閉方法

    Redis的配置、啟動(dòng)、操作和關(guān)閉方法

    今天小編就為大家分享一篇Redis的配置、啟動(dòng)、操作和關(guān)閉方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧 ...

    大道化簡(jiǎn)5312019-11-14
  • Redisredis中如何使用lua腳本讓你的靈活性提高5個(gè)逼格詳解

    redis中如何使用lua腳本讓你的靈活性提高5個(gè)逼格詳解

    這篇文章主要給大家介紹了關(guān)于redis中如何使用lua腳本讓你的靈活性提高5個(gè)逼格的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具...

    一線碼農(nóng)5812019-11-18
  • RedisRedis 事務(wù)知識(shí)點(diǎn)相關(guān)總結(jié)

    Redis 事務(wù)知識(shí)點(diǎn)相關(guān)總結(jié)

    這篇文章主要介紹了Redis 事務(wù)相關(guān)總結(jié),幫助大家更好的理解和學(xué)習(xí)使用Redis,感興趣的朋友可以了解下...

    AsiaYe8232021-07-28
  • RedisRedis全量復(fù)制與部分復(fù)制示例詳解

    Redis全量復(fù)制與部分復(fù)制示例詳解

    這篇文章主要給大家介紹了關(guān)于Redis全量復(fù)制與部分復(fù)制的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Redis爬蟲(chóng)具有一定的參考學(xué)習(xí)...

    豆子先生5052019-11-27
  • Redisredis 交集、并集、差集的具體使用

    redis 交集、并集、差集的具體使用

    這篇文章主要介紹了redis 交集、并集、差集的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友...

    xiaojin21cen10152021-07-27
主站蜘蛛池模板: 日韩精品无 | 欧美日韩一区二区电影 | 成年人毛片在线观看 | 亚洲综合二区 | 伊人福利视频 | 日本少妇一区二区三区 | 黄色片免费观看网站 | 亚洲福利二区 | 欧美日韩精品一区二区在线观看 | 成人h动漫在线看 | 久久国产精品一区 | 日韩欧美专区 | 亚洲啊v| 日韩欧美国产一区二区三区 | 伊人久久综合 | 黄色av网站免费 | 黄色片视频在线观看 | 国产亚洲精品久久久久久无几年桃 | 欧美一区二区最爽乱淫视频免费看 | 欧美综合一区 | 欧美成人精品一区二区三区 | 国产精品爱久久久久久久 | 国产福利视频在线观看 | 亚洲天堂av网 | 一区二区国产精品 | av在线电影观看 | 国产片在线观看 | 成人婷婷网色偷偷亚洲男人的天堂 | 性色综合 | 久草视频播放 | 国色天香成人网 | 日本免费中文字幕 | 中文字幕在线观看一区二区 | 亚洲福利二区 | 国产成人精品久久 | 天天操夜夜操av | 黄色在线免费 | 欧美成人免费在线视频 | 91久久久久久久久 | 国产精品视频区 | 99热99|