色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

緩存被穿透了如何解決

馬哥Linux運維 ? 來源:馬哥Linux運維 ? 2023-05-23 09:54 ? 次閱讀

首先來了解幾個概念:

緩存穿透:大量請求根本不存在的key

緩存雪崩:redis中大量key集體過期

緩存擊穿:redis中一個熱點key過期(大量用戶訪問該熱點key,但是熱點key過期)

穿透解決方案

對空值進行緩存

設置白名單

使用布隆過濾器

網警

雪崩解決方案

進行預先的熱門詞匯的設置,進行key時長的調整

實時調整,監控哪些數據是熱門數據,實時的調整key的過期時長

使用鎖機制

擊穿解決方案

進行預先的熱門詞匯的設置,進行key時長的調整

實時調整,監控哪些數據是熱門數據,實時的調整key的過期時長

使用鎖機制

三者出現的根本原因在于Redis命中率下降,請求直接打在DB上。

正常情況下,大量的資源請求都會被redis響應,在redis得不到響應的小部分請求才會去請求DB,這樣DB的壓力是非常小的,是可以正常工作的(如下圖)

32969420-f8f4-11ed-90ce-dac502259ad0.png

如果大量的請求在redis上得不到響應,那么就會導致這些請求會直接去訪問DB,導致DB的壓力瞬間變大而卡死或者宕機。

大量的高并發的請求打在redis上

這些請求發現redis上并沒有需要請求的資源,redis命中率降低

因此這些大量的高并發請求轉向DB(數據庫服務器)請求對應的資源

DB壓力瞬間增大,直接將DB打垮,進而引發一系列“災害”

如下圖所示

32b3e2d2-f8f4-11ed-90ce-dac502259ad0.png

那么為什么redis會沒有需要訪問的數據呢?通過分析大致可以總結為三種情況,也就對應著redis的雪崩、穿透和擊穿

32caafa8-f8f4-11ed-90ce-dac502259ad0.png

情景分析

緩存穿透

緩存穿透產生的原因:請求根本不存在的資源(DB本身就不存在,Redis更是不存在)

舉例(情景在線):客戶端發送大量的不可響應的請求

當大量的客戶端發出類似于:http://localhost:8080/user/19833?id=-3872 的請求,就可能導致出現緩存穿透的情況。因為數據庫DB中本身就沒有id=-3872的用戶的數據,所以Redis也沒有對應的數據,那么這些請求在redis就得不到響應,就會直接打在DB上,導致DB壓力過大而卡死情景在線或宕機。

緩存穿透很有可能是黑客攻擊所為,黑客通過發送大量的高并發的無法響應的請求給服務器,由于請求的資源根本就不存在,DB就很容易被打垮了。

解決方案

對空值進行緩存:

類似于上面的例子,雖然數據庫中沒有id=-3872的用戶的數據,但是在redis中對他進行緩存(key=-3872,value=null),這樣當請求到達redis的時候就會直接返回一個null的值給客戶端,避免了大量無法訪問的數據直接打在DB上

實時監控:

對redis進行實時監控,當發現redis中的命中率下降的時候進行原因的排查,配合運維人員對訪問對象和訪問數據進行分析查詢,從而進行黑名單的設置限制服務(拒絕黑客攻擊)

使用布隆過濾器

使用BitMap作為布隆過濾器,將目前所有可以訪問到的資源通過簡單的映射關系放入到布隆過濾器中(哈希計算),當一個請求來臨的時候先進行布隆過濾器的判斷,如果有那么才進行放行,否則就直接攔截

接口校驗

類似于用戶權限的攔截,對于id=-3872這些無效訪問就直接攔截,不允許這些請求到達Redis、DB上。

注意事項:

使用空值作為緩存的時候,key設置的過期時間不能太長,防止占用太多redis資源

使用空值作為緩存只能防止黑客重復使用相同的id暴力攻擊,但是如果黑客使用動態的無效id攻擊就沒有效果(需要配合網警)

使用布隆過濾器也是有哈希沖突的可能

緩存雪崩

緩存雪崩產生的原因:redis中大量的key集體過期

舉例:

當redis中的大量key集體過期,可以理解為redis中的大部分數據都被清空了(失效了),那么這時候如果有大量并發的請求來到,那么redis就無法進行有效的響應(命中率急劇下降),請求就都打到DB上了,到時DB直接崩潰。

解決方案:

將失效時間分散開

通過使用自動生成隨機數使得key的過期時間是隨機的,防止集體過期

使用多級架構

使用nginx緩存+redis緩存+其他緩存,不同層使用不同的緩存,可靠性更強

設置緩存標記

記錄緩存數據是否過期,如果過期會觸發通知另外的線程在后臺去跟新實際的key

使用鎖或者隊列的方式

如果查不到就加上排它鎖,其他請求只能進行等待

緩存擊穿

產生緩存雪崩的原因:redis中的某個熱點key過期,但是此時有大量的用戶訪問該過期key

舉例:

類似于“某男明星塌房事件”上了熱搜,這時候大量的“粉絲”都在訪問該熱點事件,但是可能優于某種原因,redis的這個熱點key過期了,那么這時候大量高并發對于該key的請求就得不到redis的響應,那么就會將請求直接打在DB服務器上,導致整個DB癱瘓。

解決方案:

提前對熱點數據進行設置

類似于新聞、某博等軟件都需要對熱點數據進行預先設置在redis中

監控數據,適時調整

監控哪些數據是熱門數據,實時的調整key的過期時長

使用鎖機制

最后的防線,當熱點key過期,那么就使用鎖機制防止大量的請求直接打在DB

審核編輯:彭靜
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 緩存
    +關注

    關注

    1

    文章

    241

    瀏覽量

    26724
  • 過濾器
    +關注

    關注

    1

    文章

    432

    瀏覽量

    19684
  • key
    key
    +關注

    關注

    0

    文章

    51

    瀏覽量

    12836

原文標題:緩存被穿透了怎么辦?

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    何解決數據庫與緩存一致性

    緩存一致性 每次逢年過節的時候搶票非常艱難,放票的時候那么多人同時去搶票,如果所有人查詢、購票等都去訪問數據庫,那數據庫的壓力得有多大,這時候很多都會引入緩存, 把車票信息放入緩存,這樣可以減少
    的頭像 發表于 09-25 15:25 ?1141次閱讀
    如<b class='flag-5'>何解</b>決數據庫與<b class='flag-5'>緩存</b>一致性

    何解決藍牙協議棧鎖問題?

    何解決藍牙協議棧鎖問題
    發表于 03-21 08:21

    使用altium designer時候出現了如下錯誤

    使用altium designer時候出現了如下錯誤,請問應該如何解決??跪謝!
    發表于 01-26 15:36

    搭建自己的IOT平臺---內網穿透

    IOT平臺的外網訪問。在虛擬機完成IOT平臺搭建之后,接下來就是內網穿透了,其實很簡單·,只需在花生殼官網注冊一個賬號,每個賬號都會有兩個免費的內網穿透的域名供你使用。官網網址 https
    發表于 12-09 23:14

    汽車電池沒電了如何解決?教你“借電”技巧

    汽車電池沒電了如何解決?教你“借電”技巧 要發動汽車,卻發現電池沒電了,想必許多人都遇到過這種情況。所以,如何正確“借電”也是開車的一門
    發表于 11-06 08:44 ?7727次閱讀

    iphone密碼多次輸入錯誤鎖如何解?

    iphone密碼多次輸入錯誤鎖如何解? iPhone允許您設置一個密碼,在開機或按下喚醒按鈕時可以輸入此密碼。這在 iPhone用戶指南和功能
    發表于 02-02 09:45 ?3.3w次閱讀

    何解決模擬混合信號設計的挑戰

    這種按需網絡研討會演示了如何解決模擬混合信號設計挑戰增加可靠性和速度與AMS墊專業產品開發。
    的頭像 發表于 10-18 07:08 ?3562次閱讀

    緩存雪崩/穿透/擊穿的解決方案

    緩存是我們項目應用肯定會使用,是我們數據庫的守護神,能夠保證數據庫的穩定,能夠提高整個系統的性能。一般我們采用市面上的redis、memcahce方案;redis已經非常強大了,每秒支持幾萬的連接時不成問題。
    發表于 01-26 09:44 ?1328次閱讀
    <b class='flag-5'>緩存</b>雪崩/<b class='flag-5'>穿透</b>/擊穿的解決方案

    如何設計一個緩存系統?

    設計一個緩存系統,不得不要考慮的問題就是:緩存穿透緩存擊穿與失效時的雪崩效應。 緩存穿透
    的頭像 發表于 02-08 11:40 ?2965次閱讀

    如何在SpringBoot中解決Redis的緩存穿透等問題

    今天給大家介紹一下如何在SpringBoot中解決Redis的緩存穿透緩存擊穿、緩存雪崩的問題。
    的頭像 發表于 04-28 11:35 ?753次閱讀

    基于循環隊列的FIFO緩存實現

    FIFO緩存是介于兩個子系統之間的彈性存儲器,其概念圖如圖1所示。它有兩個控制信號,wr和rd,用于讀操作和寫操作。當wr插入時,輸入的數據寫入緩存,此時讀操作被忽視。FIFO
    的頭像 發表于 09-11 10:12 ?848次閱讀
    基于循環隊列的FIFO<b class='flag-5'>緩存</b>實現

    為什么GPU獲得了如此多的緩存

    不久之前,如果您想要一個內置大量緩存的處理器,那么 CPU 是顯而易見的選擇。現在,即使是預算級 GPU 也比幾年前的高端 CPU 配備了更多的內存。
    的頭像 發表于 10-07 17:37 ?1917次閱讀
    為什么GPU獲得<b class='flag-5'>了如</b>此多的<b class='flag-5'>緩存</b>?

    如何使用緩存

    緩存技術認為是減輕服務器負載、降低網絡擁塞、增強Web可擴展性的有效途徑之一,其基本思想是利用客戶訪問的時間局部性(Temproral Locality)原理, 將客戶訪問過的內容在Cache中
    的頭像 發表于 10-08 14:07 ?676次閱讀

    Redis緩存預熱+緩存雪崩+緩存擊穿+緩存穿透要點簡析

    緩存預熱就是系統上線后,提前將相關的緩存數據直接加載到緩存系統。
    的頭像 發表于 12-25 09:41 ?931次閱讀
    Redis<b class='flag-5'>緩存</b>預熱+<b class='flag-5'>緩存</b>雪崩+<b class='flag-5'>緩存</b>擊穿+<b class='flag-5'>緩存</b><b class='flag-5'>穿透</b>要點簡析

    HTTP緩存頭的使用 本地緩存與遠程緩存的區別

    :資源的特定版本標識,用于驗證資源是否修改。 Last-Modified :資源最后修改時間,用于驗證資源是否修改。 Vary :告訴緩存服務
    的頭像 發表于 12-18 09:41 ?159次閱讀
    主站蜘蛛池模板: 天天狠狠色综合图片区 | 高清国产在线观看 | 国产成人亚洲综合无 | 色久悠悠无码偷拍自怕 | 大陆女人内谢69XXXORG | av女优快播 | 麻豆精品传媒卡一卡二传媒短视频 | 热久久国产欧美一区二区精品 | 男女啪啪抽搐呻吟高潮动态图 | 日日夜夜影院在线播放 | 视频一区国产精戏刘婷30 | 窝窝色资源站 | 国产啪视频在线播放观看 | 干丝袜美女 | 亚洲理论片在线中文字幕 | 动漫人物差差差30分钟免费看 | 空姐内射出白浆10p 空姐厕所啪啪啪 | 蜜桃传媒一区二区亚洲AV | 三男强一女90分钟在线观看 | 伊人最新网址 | 色精品极品国产在线视频 | 日日色在线影院 | 高H高肉强J短篇NP | 收集最新中文国产中文字幕 | 秋霞电影伦网理最新在线看片 | 欧美多毛的大隂道 | 亚洲AV综合99一二三四区 | vr亚洲成年网址在线观看 | 天天爽夜夜爽夜夜爽 | 99久久精品免费国产一区二区三区 | 国产成人a视频在线观看 | 国产成人8x视频一区二区 | 亚洲国产精品无码中文字满 | 精品久久久亚洲精品中文字幕 | 97精品视频在线观看 | 世界上第一个得抑郁症的人是谁 | 最新无码国产在线视频9299 | 亚洲精品在线影院 | 精品视频在线观看视频免费视频 | 国产成人免费片在线观看 | 国产成人精品免费视频大 |