一、緩存常用的三種模式和爲什麼需要外部緩存?

  1. 如何保證緩存與數據庫的雙寫一致性
  2. 嚴格要求一致性:採用讀請求和寫請求串行化,串到一個內存隊列去,會導致內存吞吐量降低
  3. 不嚴格要求
    1. cache aside pattern
      1. 讀的時候先讀緩存,緩存沒有,讀取數據庫,放入緩存,返回相應
      2. 更新先更新數據庫(鎖表),再刪除緩存,緩存設置過期時間
        1. 爲什麼刪除,緩存不僅僅是數據庫數據,
        2. 更新緩存代價比較好,不頻繁數據不需要更新,兩個併發寫導致髒數據
        3. 有可能存在寫多讀少情況,有懶加載思想
      3. 問題:刪除緩存失敗,緩存中老數據,數據庫中新數據
        1. 先刪除緩存,在更新數據庫,併發高也有問題,加鎖,
        2. 設置過期時間,允許短時不一致
      4. 複雜數據不一致,上億流量併發,每秒1萬讀請求,只要1s有寫數據請求,就會出現問題
    2. read /write through pattern
      1. read through
        1. 讀取數據,緩存中存在返回,緩存不存在,由緩存組件自己加載緩存,返回
      2. write through
        1. 寫數據,如果,緩存失效,更新數據庫,返回,如果緩存不失效,更新緩存,又緩存組件自己同步更新數據庫
    3. write behind cache pattern
      1. write
        1. 寫數據,直接更新緩存由緩存組件異步更新數據庫,這樣數據io操作非常快,而且可以合併多個更新請求
        2. 缺點:服務器宕機,數據丟失,邏輯複雜
    4. 爲什麼需要分佈式緩存(redis)
      1. 本地緩存佔用內存空間大
      2. 一個service多個機器集羣部署,負載均衡器發個同一個請求到不同實例,每個實例會建立緩存,浪費
      3. 分佈式系統需要有一個外部緩存,要求內存足夠大,io密集型
      4. 內存大,可以利用數據分片技術,把緩存分不到不同機器,可以無限擴內存
        1. 命中率,80%算是高
        2. 緩存犧牲了強一致性
        3. 緩存過期時間也要設計好,太長浪費內存,太短熱點數據頻繁更新內存,採用lru
        4. 爬蟲保護機制
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章