<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在實際開發中常常遇到如下需求:判斷當前元素是否存在於已知的集合中,將已知集合中的元素維護一個HashSet
,使用時只需耗時O(1)
的時間複雜度便可判斷出結果,Java內部或者Redis均提供相應的資料結構。使用此種方式除了佔用記憶體空間外,幾乎沒有其它缺點。
當資料量達到億級別時,記憶體空間的佔用顯著表現出來,BitMap
便是解決此類問題的一種途徑。
Redis BitMap能夠儲存的資料範圍為[0,2^32-1]
,超過Integer.MAX_VALUE
上界值。
為了簡化討論,假設討論的集合元素的範圍為[0,Integer.MAX_VALUE]
,可以是其中的任何一個數。
使用HashSet
資料結構佔用記憶體空間僅與集合中的元素數量(N)相關。當集合中元素數量為N時,所需的記憶體空間大概為N*4/1024/1024
MB,1億
條資料約佔記憶體空間381MB
。
基於Redis的BitMap所佔用的空間大小不與集合中元素數量相關,與集合中元素的最大值直接相關,因此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); }
這裡給出了一組測試參考資料
如果集合中最大值為100000000 ,則所佔用的記憶體空間為 11MB
如果集合中最大值為500000000 ,則所佔用的記憶體空間為 59MB
如果集合中最大值為1000000000,則所佔用的記憶體空間為119MB
如果集合中最大值為2147483647,則所佔用的記憶體空間為255MB
當集合中資料增長到10億
條時,使用BItMap最大佔用記憶體約為255MB
,而使用HashSet增長到3.8GB
。
使用Redis命令列可直接操作BitMap,將offset
位置的值標註為1,則表示當前資料存在。預設情況下未標註的位置值為0。
# 預設位不賦值為0,當資料存在於集合中,將對應位賦值為1 SETBIT key offset value # 檢視對應位資料是否存在(1表示存在,0表示不存在) GETBIT key offset
這裡提供一個SpringBoot生態的RedisUtils
工具類,內部封裝操作Redis BitMap的工具方法。
// 將當前位置標記為true RedisUtils.setBit(BIT_MAP_KEY, orderId, true); // 獲取指定位置的值(對應數值是否存在) 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>
BitMap的儲存與取值時間複雜度為O(1)
,根據數值可直接對映下標。
BitMap佔用記憶體空間複雜度為O(n)
,與集合中元素的最大值正相關,不是集合中元素的數量。
快取穿透是指當前請求的資料在快取中不存在,需要存取資料庫獲取資料(資料庫中也不存在請求的資料)。快取穿透給資料庫帶來了壓力,惡意快取穿透甚至能造成資料庫宕機。
使用BitMap動態維護一個集合,當存取資料庫前,先查詢資料的主鍵是否存在集合中,以此作為是否存取資料庫的依據。
BitMap新增資料或者移除資料屬於輕量級操作,檢查操作的準確度依賴於動態集合維護的閉環的完整性。比如向資料庫增加資料時需要向BitMap中新增資料,從資料庫中刪除資料需要從BitMap中移除資料。如果要求嚴格的檢查可靠性,則可以單獨維護一個分散式定時任務,定期更新BitMap資料。
布隆過濾器與BitMap有相似的應用場景,但也有一定的區別。給定一個數,BitMap能準確知道是否存在於已知集合中;布隆過濾器能準確判斷是否不在集合中,卻不能肯定存在於集合中。
BitMap增加或者移除資料時間複雜度為O(1),方便快捷。布隆過濾器新建容易,剔除資料操作比較繁瑣。
在一些需要精確判斷的場景,優先選擇BitMap,比如判斷手機號是否已經註冊。
Redis BitMap不是一種新的資料結構,是利用字串型別做的一層封裝,看起來像一種新型資料結構。BitMap不像一種技術,更像是演演算法,在時間複雜度和空間複雜度之間尋找平衡點。
BitMap其它應用場景比如簽到打卡,統計線上人數等等。
到此這篇關於基於Redis分散式BitMap的應用的文章就介紹到這了,更多相關Redis分散式BitMap內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45