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

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

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

前言

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

緩存穿透、擊穿、雪崩

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

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

緩存穿透

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

出現(xiàn)情況

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

常見的解決方案

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

緩存擊穿

出現(xiàn)情況

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

解決方案

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

緩存雪崩

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

解決方案

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

布隆過濾器 Bloom filter

前面提到過布隆過濾器在請求比較高的時候,可以幫助我們抵擋一部分請求,從而減輕數(shù)據(jù)庫的壓力,布隆過濾器的數(shù)據(jù)結(jié)構(gòu)是一個二進(jìn)制的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ā)之布隆過濾器詳解的詳細(xì)內(nèi)容,更多關(guān)于Redis布隆過濾器處理高并發(fā)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

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

    Redis緩存更新策略詳解

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

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

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

    詳細(xì)聊聊Redis的過期策略

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

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

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

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

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

最新評論

凤山市| 涿州市| 新河县| 崇阳县| 赤壁市| 右玉县| 离岛区| 名山县| 瑞安市| 鹤庆县| 和政县| 京山县| 东至县| 台北市| 内江市| 大新县| 梧州市| 蓝田县| 利津县| 宁南县| 于都县| 绥棱县| 大兴区| 阳西县| 长乐市| 福建省| 临潭县| 江阴市| 常州市| 武乡县| 惠水县| 阿克陶县| 长兴县| 宜君县| 北宁市| 柞水县| 哈密市| 栖霞市| 谢通门县| 鄂尔多斯市| 胶南市|