最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Redis處理高并發(fā)之布隆過濾器詳解

 更新時間:2022年12月29日 14:42:43   作者:Lxlxxx  
這篇文章主要為大家介紹了Redis處理高并發(fā)之布隆過濾器詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

前言

隨著我們業(yè)務開發(fā)越來越來大,并染請求就會越來越多,那么我們的項目的壓力就會越來越大,基本都會使用緩存,除本地緩存,還會用到redis緩存,但是你以為使用緩存就沒啥問題了么,那肯定不是的,使用了緩存又會出現(xiàn)新的問題,比如,緩存的key失效導致大量的請求到數(shù)據(jù)庫,大量的讀請求瞬間到達了數(shù)據(jù)庫,cpu的使用率爆增,導致數(shù)據(jù)庫都可能掛掉,這種情況下我們就要考慮使用redis的布隆過濾器了。

緩存穿透、擊穿、雪崩

首先我們從緩存會出現(xiàn)的幾種問題,來進行分析,在高并發(fā)的場景下如果出現(xiàn)這種情況,我們應該如何解決。

正常情況下,我們的web應用會先去請求緩存服務,如果緩存命中,那么就去拿緩存里面的數(shù)據(jù),返回結(jié)果給應用,

緩存穿透

緩存穿透與緩存雪崩和緩存擊穿還是不一樣的,雪崩和擊穿的情況下,數(shù)據(jù)庫的數(shù)據(jù)都是真正常的,可以去請求數(shù)據(jù)庫獲取數(shù)據(jù),只是緩存層出現(xiàn)問題,等待緩存恢復了,就會減輕數(shù)據(jù)庫的壓力。 而緩存透不一樣的就是,緩存和數(shù)據(jù)庫都沒有要請求的數(shù)據(jù),大量的請求來了,數(shù)據(jù)庫的壓力很大。

出現(xiàn)情況

  • 數(shù)據(jù)庫數(shù)據(jù)被大量清除,導致訪問不到
  • 黑客惡意攻擊

常見的解決方案

  • redis緩存空值,請求不到的時候返回給應用空值。
  • 使用布隆過濾器,把數(shù)據(jù)庫的一部分數(shù)據(jù)hash到布隆過濾器里,在請求數(shù)據(jù)庫之前先去布隆過濾器里篩選到一部分請求,判斷數(shù)據(jù)是否存在,避免直接去訪問數(shù)據(jù)庫。

緩存擊穿

出現(xiàn)情況

  • 大量熱點數(shù)據(jù)庫過期,導致無法從緩存獲取到數(shù)據(jù),大量請求數(shù)據(jù)庫也無法返回書就

解決方案

  • 加鎖,保證同一時間內(nèi),只允許有一個線程去更新緩存,等鎖釋放后在重新去請求緩存。
  • 熱點數(shù)據(jù)不去設置過期時間,如果要設置過期時間,在過期的時候通知后臺去更新緩存的過期時間。

緩存雪崩

  • 大量緩存在同一時間失效,導致大量請求進入數(shù)據(jù)庫
  • redis故障宕機,導致緩存不能使用。

解決方案

  • 同上加鎖
  • 給緩存的過期時間加入隨機數(shù),保證緩存不會在同一時間同時失效。
  • 副本key策略,就是對于一個key,在它的基礎上在設置一個key,它們的value都是一樣的,只不過一個設置過期時間、一個不設置過期時間,相當于給key做了個副本,只不過在更新緩存的時候,副本key也是要更新的,避免出現(xiàn)數(shù)據(jù)不一致的現(xiàn)象。

布隆過濾器 Bloom filter

前面提到過布隆過濾器在請求比較高的時候,可以幫助我們抵擋一部分請求,從而減輕數(shù)據(jù)庫的壓力,布隆過濾器的數(shù)據(jù)結(jié)構是一個二進制的bit向量,或者說是一個bit數(shù)組,它相對于list、set、map這些集合,它占用的空間更少,不足之處處就是返回的結(jié)果會有一定概率的誤差。

public static void main(String[] args) {
    int size = 1_000_000;
    BloomFilter<Integer> bloomFilter = BloomFilter.create(Funnels.integerFunnel(), size);
    for (int i = 0; i < size; i++) {
        bloomFilter.put(i);
    }
    for (int i = 0; i < size; i++) {
        if (!bloomFilter.mightContain(i)) {
            System.out.println("有漏網(wǎng)之魚");
        }
    }
    List<Integer> list = new ArrayList<>(1000);
    for (int i = size + 10000; i < size + 20000; i++) {
        if (bloomFilter.mightContain(i)) {
            list.add(i);
        }
    }
    System.out.println("有誤差的數(shù)量:" + list.size());
}

確實有誤差的數(shù)量,但是誤差量不大,追求效率的同時只是犧牲一點誤差了。

總結(jié)

加鎖的排隊的場景確實能幫助我們很好的解決緩存穿透、擊穿的一些問題,但是效率也是非常低了,因為每個請求都是排隊等待,如果可以接受輕微誤差的話,布隆過濾器的確是個很不錯的選擇,Bloom filter的bitmap的存儲效率確實很高。

以上就是Redis處理高并發(fā)之布隆過濾器詳解的詳細內(nèi)容,更多關于Redis布隆過濾器處理高并發(fā)的資料請關注腳本之家其它相關文章!

相關文章

  • Redis精確去重計數(shù)方法(咆哮位圖)

    Redis精確去重計數(shù)方法(咆哮位圖)

    這篇文章主要給大家介紹了關于Redis精確去重計數(shù)方法(咆哮位圖)的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Redis具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-06-06
  • Redis源碼設計剖析之事件處理示例詳解

    Redis源碼設計剖析之事件處理示例詳解

    這篇文章主要為大家介紹了Redis源碼設計剖析之事件處理示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • 詳解Redis中key的命名規(guī)范和值的命名規(guī)范

    詳解Redis中key的命名規(guī)范和值的命名規(guī)范

    這篇文章主要介紹了詳解Redis中key的命名規(guī)范和值的命名規(guī)范,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • 如何高效使用Redis作為LRU緩存

    如何高效使用Redis作為LRU緩存

    這篇文章主要介紹了如何高效使用Redis作為LRU緩存,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • 在不重啟的情況下熱更新Redis集群密碼的流程步驟

    在不重啟的情況下熱更新Redis集群密碼的流程步驟

    當我們需要在運行中的 Redis 集群中修改密碼時,可以通過 Redis 的配置命令 CONFIG SET 實現(xiàn)即時修改,并使用 CONFIG REWRITE 將更改持久化到配置文件中,在本文中,我們將詳細介紹如何安全地更新你的 Redis 集群密碼,需要的朋友可以參考下
    2024-05-05
  • Redis緩存更新策略詳解

    Redis緩存更新策略詳解

    這篇文章主要為大家詳細介紹了Redis緩存更新策略,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • Redis常見限流算法原理及實現(xiàn)

    Redis常見限流算法原理及實現(xiàn)

    這篇文章主要介紹了Redis常見限流算法原理及實現(xiàn),限流簡稱流量限速(Rate?Limit)是指只允許指定的事件進入系統(tǒng),超過的部分將被拒絕服務、排隊或等待、降級等處理
    2022-08-08
  • 詳細聊聊Redis的過期策略

    詳細聊聊Redis的過期策略

    redis 過期策略是定期刪除+惰性刪除,下面這篇文章主要給大家介紹了關于Redis過期策略的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-01-01
  • 基于Redis結(jié)合SpringBoot的秒殺案例詳解

    基于Redis結(jié)合SpringBoot的秒殺案例詳解

    這篇文章主要介紹了Redis結(jié)合SpringBoot的秒殺案例,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • redis-cli 使用密碼登錄的實例

    redis-cli 使用密碼登錄的實例

    今天小編就為大家分享一篇redis-cli 使用密碼登錄的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05

最新評論

罗田县| 卢氏县| 洛隆县| 浙江省| 五指山市| 拉孜县| 阿尔山市| 丹巴县| 桂林市| 东丰县| 铁岭市| 普洱| 陕西省| 湘西| 旅游| 嵩明县| 西华县| 神农架林区| 桦川县| 金寨县| 阜南县| 旅游| 荆门市| 崇明县| 河北省| 会理县| 延寿县| 丹寨县| 闽侯县| 略阳县| 宁明县| 铁力市| 宜章县| 星座| 桐城市| 家居| 新泰市| 定边县| 黎城县| 丰城市| 南投市|