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

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

3天內不再提示

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

馬哥Linux運維 ? 來源:51CTO ? 2023-12-25 09:41 ? 次閱讀

1、緩存預熱

1、定義

緩存預熱就是系統上線后,提前將相關的緩存數據直接加載到緩存系統。

避免在用戶請求的時候,先查詢數據庫,然后再將數據緩存的問題!用戶直接查詢事先被預熱的緩存數據!


2、解決方案

1)直接寫個緩存刷新頁面,上線時手工操作下。
2)數據量不大,可以在項目啟動的時候自動進行加載。
3)定時刷新緩存。

2、緩存雪崩

發生原因
redis主機掛了,redis全面崩潰,偏硬件運維
redis中有大量key同時過期大面積失效,偏軟件開發


預防和解決
redis中key設置為永不過期or過期時間錯開
redis緩存集群實現高可用
    主從+哨兵
    redis cluster
    開啟redis持久化機制aof/rdb,盡快恢復緩存集群
多緩存結合預防雪崩
    ehcache本地緩存+redis緩存
服務降級
    Hystrix或者阿里sentinel限流&降級

3、緩存擊穿

3.1、是什么

請求去查詢一條記錄,先查redis無,后查mysql無,都查詢不到該條記錄
但是請求每次都會打到數據庫上面去,導致后臺數據庫壓力暴增,這種現象稱為緩存穿透,rendis變成了一個擺設


簡單來說,本來無一物,兩庫都沒有
即不在redis緩存庫,也不在mysql,數據庫存在被多次暴擊風險

3.2、解決

fc5b0896-a244-11ee-8b88-92fbcf53809c.png

方案1:空對象緩存或者缺省值

第一種解決方案,回寫增強
如果發生了緩存穿透,我們可以針對要查詢的數據,在Redis里存一個和業務部門商量后確定的缺省值(比如,零、負數、defaultNull等)。
比如,鍵uid:abcdxxx,值defaultNull作為案例的key和value
先去redis查鍵uid:abcdxxx沒有,再去mysql查沒有獲得 ,這就發生了一次穿透現象。


but,可以增強回寫機制
mysql也查不到的話也讓redis存入剛剛查不到的key并保護mysql。
第一次來查詢uid:abcdxxx,redis和mysql都沒有,返回null給調用者,但是增強回寫后第二次來查uid:abcdxxx,此時redis就有值了。
可以直接從Redis中讀取default缺省值返回給業務應用程序,避免了把大量請求發送給mysql處理,打爆mysql。


但是,此方法架不住黑客的惡意攻擊,有缺陷......,只能解決key相同的情況


黑客或惡意攻擊
黑客會對你的系統進行攻擊,拿一個不存在的id去查詢數據,會產生大量的請求到數據庫去查詢,可能會導致你的數據庫由于壓力過大而宕掉


key相同打你系統
  第一次打到mysql空對象緩存后第二次就返回default Null缺省值
  避免mysql被攻擊,不用再到數據庫中去走一圈了
key不同打你系統
  由于存在空對象緩存和緩存會寫(看自己業務不限死)
  redis中的無關緊要的key也會越寫越多(記得設置redis過期時間)

方案2:Google布隆過濾器Guava解決緩存穿透

白名單架構

fc71f7b8-a244-11ee-8b88-92fbcf53809c.png

布隆過濾器說明

fc86e56a-a244-11ee-8b88-92fbcf53809c.png

誤判問題,但是概率小可以接受,不能從布隆過濾器刪除
全部合法的key都需要放入Guava版布隆過濾器和redis里面,不然數據就是返回null

4、緩存穿透

4.1、是什么

大量的請求同時查詢一個key時,此時這個key正好失效了,導致大量的請求都打到數據庫上面去
簡單說就是熱點key突然失效了,暴打mysql

4.1、危害

會造成某一時刻數據庫請求量過大,壓力劇增
一般技術部門需要知道熱點key時那些,防止擊穿

4.1、解決


熱點key失效
時間到了自然清除但還被訪問到
delete掉的key,剛巧又被訪問


方案1:
差異失效時間,對于訪問頻繁的熱點key,干脆就不設置過期時間
方案2:
互斥更新,采用雙檢加鎖策略


多個線程同時去查詢數據庫的這條數據,那么我們可以在第一個查詢數據的請求上使用一個 互斥鎖來鎖住它。
其他的線程走到這一步拿不到鎖就等著,等第一個線程查詢到了數據,然后做緩存。后面的線程進來發現已經有緩存了,就直接走緩存。


5、總結

fc9bca8e-a244-11ee-8b88-92fbcf53809c.png

好了,今天的小知識你學會了嗎?

鏈接:https://blog.51cto.com/u_13236892/8955597







審核編輯:劉清

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

    關注

    1

    文章

    776

    瀏覽量

    26079
  • 過濾器
    +關注

    關注

    1

    文章

    414

    瀏覽量

    19148
  • Redis
    +關注

    關注

    0

    文章

    365

    瀏覽量

    10539

原文標題:講透Redis 緩存預熱+緩存雪崩+緩存擊穿+緩存穿透

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

收藏 人收藏

    評論

    相關推薦

    使用Redis緩存model層

    〈譯〉使用REDIS處理RAILS MODEL緩存
    發表于 04-18 17:07

    redis緩存注解怎么使用

    spring boot —— redis 緩存注解使用教程
    發表于 09-11 14:43

    緩存的作用和設計模式

    查詢數據,獲取數據后并加載到緩存;緩存失效:數據更新寫到數據庫,操作成功后,讓緩存失效,查詢時候再重新加載;緩存穿透:查詢數據庫不存在的對象
    發表于 01-05 17:57

    Mybatis緩存之一級緩存

    本文主要講mybatis的一級緩存,一級緩存是SqlSession級別的緩存。mybatis提供查詢緩存,用于減輕數據壓力,提高數據庫性能。mybaits提供一級
    發表于 11-27 20:44 ?1108次閱讀
    Mybatis<b class='flag-5'>緩存</b>之一級<b class='flag-5'>緩存</b>

    渲染中的幀緩存和深度緩存

    渲染涉及大量的緩存,這里緩存只是一個簡單的存有像素數據的矩形內存塊,最重要緩存是幀緩存和深度緩存。
    的頭像 發表于 05-14 11:44 ?5685次閱讀
    渲染中的幀<b class='flag-5'>緩存</b>和深度<b class='flag-5'>緩存</b>

    解決緩存雪崩的6大解決辦法

    使用Redis 哨兵模式或者Redis 集群部署方式,即便個別Redis 節點下線,整個緩存層依然可以使用。除此之外,還可以在多個機房部署 Redi
    發表于 09-13 11:37 ?2.6w次閱讀

    什么是Web緩存,HTTP緩存和瀏覽器緩存的區別

    前端緩存主要是分為HTTP緩存和瀏覽器緩存。其中HTTP緩存是在HTTP請求傳輸時用到的緩存,主要在服務器代碼上設置;而瀏覽器
    發表于 09-13 04:17 ?9211次閱讀
    什么是Web<b class='flag-5'>緩存</b>,HTTP<b class='flag-5'>緩存</b>和瀏覽器<b class='flag-5'>緩存</b>的區別

    緩存是什么 為什么需要緩存

    緩存是軟件開發中一個非常有用的概念,數據庫緩存更是在項目中必然會遇到的場景。
    的頭像 發表于 09-28 02:48 ?1.1w次閱讀
    <b class='flag-5'>緩存</b>是什么 為什么需要<b class='flag-5'>緩存</b>

    緩存的基本原理 緩存的分類

    緩存的主要手段有:瀏覽器緩存、CDN、反向代理、本地緩存、分布式緩存、數據庫緩存。
    發表于 06-13 12:04 ?4392次閱讀

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

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

    如何設計一個緩存系統?

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

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

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

    緩存穿透了如何解決

    首先來了解幾個概念: 緩存穿透:大量請求根本不存在的key 緩存雪崩redis中大量key集體過期
    的頭像 發表于 05-23 09:54 ?445次閱讀
    <b class='flag-5'>緩存</b>被<b class='flag-5'>穿透</b>了如何解決

    聊聊本地緩存和分布式緩存

    本地緩存 :應用中的緩存組件,緩存組件和應用在同一進程中,緩存的讀寫非???,沒有網絡開銷。但各應用或集群的各節點都需要維護自己的單獨緩存,無
    發表于 06-11 15:12 ?605次閱讀
    聊聊本地<b class='flag-5'>緩存</b>和分布式<b class='flag-5'>緩存</b>

    mybatis一級緩存和二級緩存的原理

    MyBatis是一種輕量級的持久化框架,它提供了一級緩存和二級緩存的機制來優化數據庫操作性能。一級緩存是默認開啟的,而二級緩存需要手動配置啟用。 一、一級
    的頭像 發表于 12-03 11:55 ?584次閱讀
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>