Redis的中BitMap的應用

一、應用場景

通常用于構建布隆過濾器

業務場景需要頻繁的查詢數據庫里的數據,但是這些數據又不一定都存在,一些大量無效的數據庫請求,占用了數據庫的鏈接。

本質上保護數據庫,減少無用的請求。

解決:

1、把查詢的數據key放入redis Set中,只有存在才會去查詢,問題就是set過于大,檢查是否存在也會變慢

2、當庫中不存在該值時,依然創建一個value設置為空值,等過期時間后,自行刪除。有可能上一秒庫中不存在,下一秒有了,拿走依然是空值,也不行。

3、布隆過濾器

布隆過濾器(Bloom Filter)是 1970 年由布隆提出的。它實際上是一個很長的二進制向量和一系列隨機映射函數。主要用于判斷一個元素是否在一個集合中。

通常我們會遇到很多要判斷一個元素是否在某個集合中的業務場景,一般想到的是將集合中所有元素保存起來,然后通過比較確定。鏈表、樹、散列表(又叫哈希表,Hash table)等等數據結構都是這種思路。但是隨著集合中元素的增加,我們需要的存儲空間也會呈現線性增長,最終達到瓶頸。同時檢索速度也越來越慢。上述三種結構的檢索時間復雜度分別為:

  • O(n):鏈表
  • O(logn):樹
  • O(1):哈希表

這個時候,布隆過濾器(Bloom Filter)就應運而生。

1.1. 原理

當一個元素被加入集合時,通過N個Hash函數將這個元素進行Hash,算出一個整數索引值,然后對數組長度進行取模運算,從而得到一個位置,每個Hash函數都會得到一個不同的位置,然后再把位數組中的幾個位置點都置為1。

檢索時,也會把哈希的幾個位置算出來,然后看看位數組中對應的幾個位置是否都為1,只要有一個位為0,那么就說明布隆過濾器里不存在這個元素。

但是,這幾個位置都為1,并不能完全說明這個元素就一定存在其中。因為散列函數是會有碰撞的,不同的輸入,可能在哈希后為同一個位置。即有可能這些位置為1是因為其他元素的存在,這就是布隆過濾器會出現誤判的原因。

因此查詢某個變量的時候我們只要看看這些點是不是都是 1 就可以大概率知道集合中有沒有它了

  • 如果這些點有任何一個 0
  • 如果都是 1,則被查詢變量很可能存在。

1.2 特性與優缺點

1. 不存在時一定不存在

一個元素如果判斷結果為存在的時候元素不一定存在,但是判斷結果為不存在的時候則一定不存在。

原因:布隆過濾器的誤判是指多個輸入經過哈希之后,在相同的bit位的值置1了,這樣就無法判斷究竟是哪個輸入產生的,因此誤判的根源在于相同的 bit 位被多次映射且置 1。

2. 只增不刪

布隆過濾器可以添加元素,但是不能刪除元素。因為刪掉元素會導致誤判率增加。

原因:上述原因中的情況,多個輸入經過哈希之后,在相同的bit位的值置1了,也造成了布隆過濾器的刪除問題。因為布隆過濾器的每一個 bit 并不是獨占的,很有可能多個元素共享了某一位。如果我們直接刪除這一位的話,會影響其他的元素。

如果需要刪除一批元素,可以考慮重新初始化一個布隆過濾器,替換原來的。

3. 優點

  • 占用空間極小,插入和查詢速度極快;
  • 布隆過濾器可以表示全集,其它任何數據結構都不能;

3. 缺點

  • 誤算率隨著元素的增加而增加;
  • 一般情況下無法刪除元素;

1.3 應用場景

基于上述的功能,我們大致可以把布隆過濾器用于以下的場景之中:

1. 大數據判斷是否存在來實現去重

這就可以實現出上述的去重功能,如果你的服務器內存足夠大的話,那么使用 HashMap 可能是一個不錯的解決方案,理論上時間復雜度可以達到 O(1) 的級別,但是當數據量起來之后,還是只能考慮布隆過濾器。

2. 判斷用戶是否訪問過

判斷用戶是否閱讀過某視頻或文章,比如抖音或頭條,當然會導致一定的誤判,但不會讓用戶看到重復的內容。

3. 爬蟲/郵箱等系統的過濾

平時不知道你有沒有注意到有一些正常的郵件也會被放進垃圾郵件目錄中,這就是使用布隆過濾器誤判導致的。

4. 天然適合緩存穿透場景

布隆過濾器天然就能應對緩存穿透的場景。

首先,布隆過濾器的應用策略正好和緩存是相反的:

  • 緩存策略:緩存中不存在的,再去查db。
  • 布隆過濾器策略:過濾器中存在的,再去查緩存(db)。

然后,由于它的特性:一個元素如果判斷結果為存在的時候元素不一定存在,但是判斷結果為不存在的時候則一定不存在。

這表明它的誤判率并不影響它的策略:

  • 當判斷結果為存在時:不一定存在。帶來的不好的結果,頂多就是多查一次緩存。
  • 當判斷結果為不存在時:一定不存在。策略中判斷不存在時,當前請求就會被攔截,這方面是沒有誤判的。

所以說,布隆過濾器天然適合緩存穿透的場景,它的誤判率對與該場景沒有絲毫影響。

1.4 實現

有很多布隆過濾器的實現,就如同之前將限流器的實現有 guava 和 redisson,布隆過濾器的實現也一樣。

下面兩種實現方式十分相似,都會初始化兩個參數:

  • 初始容量:當實際元素的數量超過這個初始化容量時,誤判率上升。設置的過大,會浪費存儲空間,設置的過小,就會影響準確率,所以在使用之前一定要盡可能地精確估計好元素數量,還需要加上一定的冗余空間以避免實際元素可能會意外高出設置值很多。
  • 期望錯誤率:期望錯誤率越低,需要的空間就越大。錯誤率越小,需要的存儲空間就越大,對于不需要過于精確的場景,錯誤率設置稍大一點也可以。

參考文獻:https://segmentfault.com/a/1190000043505315

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/45647.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/45647.shtml
英文地址,請注明出處:http://en.pswp.cn/web/45647.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

(01)Unity使用在線AI大模型(使用百度千帆服務)

目錄 一、概要 二、環境說明 三、申請百度千帆Key 四、使用千帆大模型 四、給大模型套殼 一、概要 在Unity中使用在線大模型分為兩篇發布,此篇文檔為在Python中使用千帆大模型,整體實現邏輯是:在Python中接入大模型—>發布為可傳參的…

護眼臺燈的功能作用有哪些?深挖臺燈護眼是真的嗎

隨著現代生活方式的改變,孩子們面臨著越來越多的視力挑戰。在近視學生中,近10%為高度近視,且占比隨年級升高而增長。幼兒園6歲兒童中有1.5%為高度近視,而高中階段則達到了17.6%。為了守護孩子們的視力健康,在科技飛速發…

關鍵字 internal

在C#中,internal 關鍵字是一個訪問修飾符,它用于限制類型或類型成員的訪問性。當一個類型(類、結構體、接口、枚舉等)或類型成員(字段、屬性、方法、事件等)被聲明為 internal 時,它只能在同一程…

無符號數和有符號數的轉換

1、有符號數轉換成無符號數 1.1 例一 首先,我們需要清楚 C語言中負數是以補碼的形式進行存儲的。 示例:負數-1, (此處,假設是8位二進制表示) 對應正數的原碼:0000 0001;取反&…

通俗易懂多圖透徹講解二叉樹的遍歷--前序, 中序和后序

二叉樹的遍歷是一個數據結構中經常會遇到的知識點, 具體又分為前序, 中序和后序三種. 什么是樹? 先來理解一下什么是樹, 從一個我們相對熟悉的家譜樹(Family Tree)說起吧. 家族的根是爺爺, 然后生了兩個娃, 大伯和你爸爸. 繼續往下, 有堂哥堂姐, 還有你以及你妹, 等等. 一個…

簡化流程,強化協作——揭秘可道云TeamOS文檔審批的實用魅力

在團隊協作的過程中,文檔審批是確保信息安全和流程規范的重要環節。然而,傳統的文檔審批流程往往繁瑣且僵化,難以滿足團隊快速響應和靈活協作的需求。 可道云teamOS的文檔審批功能,以其獨特的靈活性和便捷性,為團隊帶…

吸血鬼之戀

吸血鬼之戀 AI制作,吸血鬼之戀,BGM選自《暮光之城》,希望大家喜歡。 歡迎你分享你的作品到我們的平臺上:http://www.shxcj.com 或者 www.2img.ai 讓更多的人看到你的才華。 創作不易,覺得不錯的話,點個贊吧…

c++字符串實現join方法,使用模板

c字符串實現join方法&#xff0c;使用模板 主要記錄下類成員函數&#xff0c;申明為模板函數的寫法 注意定義迭代器時&#xff0c;前面需要加上typename關鍵字 typename std::vector<T>::iterator it;#pragma once #include <vector> #include <string>clas…

java——Junit單元測試

測試分類 黑盒測試&#xff1a;不輸入代碼&#xff0c;給輸入值&#xff0c;看程序能夠給出期望的值。 白盒測試&#xff1a;寫代碼&#xff0c;關注程序具體執行流程。 JUnit單元測試 一個測試框架&#xff0c;供java開發人員編寫單元測試。 是程序員測試&#xff0c;即白…

PBT激光穿透率測量儀

在現代材料科學與工業制造領域&#xff0c;激光技術以其高精度、高效率和非接觸性等特點&#xff0c;成為了不可或缺的測量與加工手段。其中&#xff0c;PBT&#xff08;聚對苯二甲酸丁二醇酯&#xff09;作為一種重要的熱塑性工程塑料&#xff0c;因其優異的機械性能、耐熱性和…

嵌入式全棧設計思路:STM32G4+ChibiOS+FreeRTOS+PID控制+PFC算法構建高效智能電源管理系統(附代碼示例)

智能電源管理系統是一個基于STM32G4微控制器的高性能數字電源控制解決方案。本項目旨在設計一個功能全面、高效穩定的電源管理系統,可廣泛應用于工業控制、新能源、通信設備等領域。 1.1 系統主要特點 高精度數字電源控制&#xff1a;利用STM32G4的高性能ADC和定時器,實現精確…

HTML5+CSS3小實例:純CSS實現奧運五環

實例:純CSS實現奧運五環 技術棧:HTML+CSS 效果: 源碼: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-sca…

Spring MVC中Restful風格引入

一&#xff0c;RESTful概述 在現代Web應用開發中&#xff0c;RESTful架構風格已成為一種標準實踐&#xff0c;特別是在構建可擴展的Web服務時。Spring MVC提供了全面的支持來構建遵循REST原則的Web服務。我在此介紹如何在Spring MVC中實現RESTful風格的Web服務&#xff0c;并通…

【八大排序】java版(上)(冒泡、快排、堆排、選擇排序)

文章目錄 一、冒泡排序(重點)思路代碼 二、快排(面試重點)思路代碼 三、堆排序(面試重點)思路代碼 四、選擇排序思路代碼 一、冒泡排序(重點) 思路 前后兩兩數據進行比較&#xff0c;小的數據往前走&#xff0c;大的數據往后走&#xff0c;每一輪結束之后&#xff0c;最大的數…

網頁數據抓取:融合BeautifulSoup和Scrapy的高級爬蟲技術

網頁數據抓取&#xff1a;融合BeautifulSoup和Scrapy的高級爬蟲技術 在當今的大數據時代&#xff0c;網絡爬蟲技術已經成為獲取信息的重要手段之一。Python憑借其強大的庫支持&#xff0c;成為了進行網頁數據抓取的首選語言。在眾多的爬蟲庫中&#xff0c;BeautifulSoup和Scrap…

在Android Jetpack Compose中實現夜間模式

在Android Jetpack Compose中實現夜間模式 隨著用戶對夜間模式需求的增加,Android開發者需要掌握如何在應用中實現這一功能。Jetpack Compose作為現代Android UI工具包,提供了簡便且靈活的方式來實現夜間模式。本文將詳細介紹如何在Jetpack Compose中實現夜間模式,包括配置…

Linux系統之玩轉fortune命令

Linux系統之好玩的fortune命令 一、fortune命令介紹1.1 fortune簡介1.2 fortune中英文 二、本地環境介紹2.1 本地環境規劃2.2 本次實踐介紹 三、檢查本地環境3.1 檢查本地操作系統版本3.2 檢查系統內核版本 四、fortune英文版的使用4.1 安裝fortune英文版4.2 命令幫助4.3 fortu…

69、Flink 的 DataStream Connector 之 Kafka 連接器詳解

1.概述 Flink 提供了 Kafka 連接器使用精確一次&#xff08;Exactly-once&#xff09;的語義在 Kafka topic 中讀取和寫入數據。 目前還沒有 Flink 1.19 可用的連接器。 2.Kafka Source a&#xff09;使用方法 Kafka Source 提供了構建類來創建 KafkaSource 的實例。以下代…

安卓手機刷入Magisk面具教程

手機如果想獲取 Root 權限&#xff0c;刷入面具是必要的做法。本期文章將會教你如何刷入 Magisk 面具。 準備工作 Magisk: 關注微信公眾號 heStudio Community回復 magisk 獲取下載鏈接。第三方 Recovery&#xff08;官方 Recovery 能玩出什么花樣&#xff1f;&#xff1f;&a…