• <li id="0bn34"><legend id="0bn34"><th id="0bn34"></th></legend></li>

      <label id="0bn34"><mark id="0bn34"><strong id="0bn34"></strong></mark></label>
      <span id="0bn34"><optgroup id="0bn34"></optgroup></span> <label id="0bn34"><mark id="0bn34"><strong id="0bn34"></strong></mark></label>

      <rt id="0bn34"></rt>
      <span id="0bn34"><optgroup id="0bn34"><center id="0bn34"></center></optgroup></span>
      <li id="0bn34"><big id="0bn34"><listing id="0bn34"></listing></big></li>
      服務器端緩存失效的應對方法經驗總結
      • 更新時間:2025-05-14 23:26:30
      • 開發經驗
      • 發布時間:3年前
      • 546

      緩存失效情況舉例

      看下這個段偽代碼:

      local value = get_from_cache(key)

      if not value then

      value = query_db(sql)

      set_to_cache(value, timeout = 100)

      end

      return value

      看上去沒有問題,在單元測試情況下,也不會有異常。

      但是,進行壓力測試的時候,你會發現,每隔100秒,數據庫的查詢就會出現一次峰值。如果你的cache失效時間設置的比較長,那么這個問題被發現的機率就會降低。

      為什么會出現峰值呢?想象一下,在cache失效的瞬間,如果并發請求有1000條同時到了 query_db(sql) 這個函數會怎樣?沒錯,會有1000個請求打向數據庫。這就是緩存失效瞬間引起的風暴。它有一個英文名,叫 "dog-pile effect"。

      怎么解決?自然的想法是發現緩存失效后,加一把鎖來控制數據庫的請求。具體的細節,春哥在lua-resty-lock的文檔里面做了詳細的說明,我就不重復了,請看這里。多說一句,lua-resty-lock庫本身已經替你完成了wait for lock的過程,看代碼的時候需要注意下這個細節。

      傳統緩存失效應對策略 為了提高業務訪問速度,提升業務讀并發,很多用戶都會在業務架構中引入緩存層。業務所有讀請求全部路由到緩存層,通過緩存的內存讀取機制大大提升業務讀取性能。緩存中的數據不能持久化 ,一旦緩存異常退出,那么內存中的數據就會丟失,所以為了保證數據完整,業務的更新數據會落地到持久化存儲中,例如DB。目前云用戶的業務架構一般如下圖:

      在上圖中,大家可以看到,用戶的更新數據直接持久化到DB, 業務讀請求直接請求緩存數據,所以業務需要解決緩存失效問題,即解決因為數據變更導致緩存中的數據失效的問題。 目前業務解決緩存失效問題的解決方法一般是業務實現DB、緩存雙寫。通過業務雙寫解決緩存失效,存在如下的問題:

      代碼侵入性比較強,需要雙寫兩份存儲,任何對DB的數據變更,都需要同時更新緩存,代碼層面后期可維護程度不高

      用戶請求線程里同步調用緩存,對緩存存在強以來,遇到緩存超時等異常時,沒有辦法做到有效的重試,遇到異常給用戶返回系統錯誤、操作失敗等信息,嚴重影響用戶體驗

      用戶請求線程里同步完成DB、緩存雙寫,變更請求鏈路長,訪問延遲大,影響用戶體驗

      RDS數據訂閱消費,輕松解決緩存失效

      在阿里巴巴內部同樣也遇到了緩存失效的問題,隨著業務架構得不斷調整優化,我們已經沉淀出一套高可靠、極優雅得緩存失效架構。即通過數據傳輸提供的數據訂閱功能,異步獲取DB(例如公共云上的RDS)的增量數據,根據增量數據進行緩存失效。具體的架構類似下圖:

      在這個架構里面,緩存更新流程如下:

      1.業務完成DB更新后即返回請求

      2.數據訂閱通過日志解析方式實時解析并訂閱DB的增量更新數據,當發現DB有數據更新時,將增量數據推送給下游消費者

      3.下游消費業務一旦接收到增量更新數據,即調用消費線程進行緩存更新

      至此完成整個緩存更新過程。

      從上面的緩存失效流程,可以看出這種緩存失效機制:

      1.更新路徑短,延遲低: 緩存失效為異步流程,業務更新DB完成后直接返回,不需要關心緩存失效流程,整個更新路徑短,更新延遲低

      2.應用簡單可靠:應用無需實現復雜雙寫邏輯,只需啟動異步線程監聽增量數據,更新緩存數據即可

      3.應用更新無性能消耗:因為數據訂閱是通過解析DB的增量日志來獲取增量數據,獲取數據的過程對業務、DB性能無損

      小結 數據訂閱功能為阿里云數據傳輸提供的一種數據分發方式。通過數據訂閱實現的緩存失效策略,讓業務更新更快捷,讓業務邏輯更簡單、更可靠。

      數據訂閱只是數據傳輸提供的一種傳輸方式,除數據訂閱之外,數據傳輸還提供了數據實時同步,不停服遷移等多種傳輸能力,如需了解數據傳輸更多詳情,請猛擊數據傳輸。

      我們專注高端建站,小程序開發、軟件系統定制開發、BUG修復、物聯網開發、各類API接口對接開發等。十余年開發經驗,每一個項目承諾做到滿意為止,多一次對比,一定讓您多一份收獲!

      本文章出于推來客官網,轉載請表明原文地址:https://www.tlkjt.com/experience/7402.html
      推薦文章

      在線客服

      掃碼聯系客服

      3985758

      回到頂部

      亚洲熟妇av一区二区三区下载| 亚洲日韩中文字幕无码一区| 波多野结衣上班族| 国产一级特黄a大片免费| 色偷偷8888欧美精品久久| 国产真实乱子伦视频播放| 黄又色又污又爽又高潮动态图| 国产成年女人特黄特色毛片免| 91最新地址永久入口| 国产精品JIZZ在线观看老狼| 麻豆麻豆必出精品入口| 国产大片中文字幕在线观看| 老色鬼欧美精品| 喝乖女的奶水h1v| 玉蒲团之偷情宝鉴电影| 双手扶在浴缸边迎合着h| 男女啪啪漫画无遮挡全彩| 啊灬啊灬别停啊灬用力啊免费| 秦先生第15部大战宝在线观看| 免费无码又爽又刺激高潮视频| 精品国产香蕉伊思人在线又爽又黄 | 久久天天躁狠狠躁夜夜av| 日韩欧美不卡视频| 亚洲国产精品无码久久| 欧美日本一道高清免费3区| 人人澡人人透人人爽| 激情小说亚洲图片| 偷自拍亚洲视频在线观看99| 澳门a毛片免费观看| 亚洲精品tv久久久久久久久| 机机对机机的30分钟免费软件| 亚洲欧美国产精品| 最好看的免费观看视频| 亚洲中文字幕久久精品无码a| 日本午夜精品一区二区三区电影| 久久99精品久久水蜜桃| 性xxxxbbbb| 三极片在线观看| 国产麻豆剧果冻传媒免精品费网站| 2018中文字幕在线| 国产伦理电影网|