教你生產環境怎麼用緩存

限時分享面試&學習福利資源

好資料第一時間分享,中華石杉老師的分佈式面試突擊視頻教程,最清晰整體的微服務全面解讀的PDF,體系化的Java路線資料整理的Github,億級電商架構的視頻實戰課程,你值得擁有

獲取方式: 關注公衆號喬志勇筆記, 後臺回覆"學習資料" !!!

一、緩存的作用

1、提高數據的訪問速度,帶來系統性能的提升

2、緩存預熱,數據預先讀取,減小同時高併發訪問時數據庫的壓力

二、緩存的位置

藍色靜態緩存,黃色動態緩存

三、進程外緩存運用

最常用Cache Aside Pattern :

1)定義:

更改時先寫DB,然後刪除緩存。

​ 讀取時先讀緩存,如果沒有命中,讀數據庫,再寫緩存

2)問題: 主從數據庫的數據同步延遲帶來的問題

​ 方案一: 通過工具訂閱從庫的binlog,從庫完成同步後再做一次刪除緩存,可能有短暫的不一致,但不至於引入緩存導致主從同步造成的數據不一致更糟糕

​ 方案二:強制數據同步這段時間內讀主庫來加載緩存,可能給主庫帶來壓力

​ 做法是寫DB,往緩存中臨時數據(唯一鍵+失效時間)標記,刪除緩存 ,讀取時判斷 是否 包含在臨時數據中,分情形讀取

3)要點:

1、爲啥先寫db,後更新緩存 不行啊,因爲可能在高併發雙寫時帶來數據不一致

2、爲啥先寫db,後刪緩存,是因爲先刪緩存,後db,可能在讀寫併發時因爲主從同步延遲造成數據不一致

3、爲啥刪除緩存,是因爲大部分業務場景下修改緩存代價太大,並且對象、文本類型數據修改操作太複雜

4)實踐:

在redis中實踐最常見

四、進程內緩存運用

1、問題:多個節點的數據同步問題(CAP理論的最經典應用)

​ 解決方案一: 一致性hash緩存,問題是違背了服務器無狀態準則,一般不推薦使用

​ 解決方案二: 利用elastic—job定時或者mq實時通知所有節點,只能用在少量節點的情形

2、場景:

​ 1)很少變化的數據,業務上允許不一致

​ 例如馬蜂窩使用OHC 堆外緩存在推薦系統中增加本地容災

​ 2)需要支持非常高的併發,例如秒殺系統, 可以使用guava作爲堆內緩存,來達到定時過期,定時刷新,異步刷新 的效果

五、緩存的負面作用

1、緩存雪崩

問題:

1)緩存系統宕機 2)流量激增(高併發的寫緩存)3)緩存同時批量過期

對應的解決方案 :

​ 1)緩存系統高可用

​ 2)加鎖或者排隊限制高併發的寫緩存

​ 3)增加隨機值避免同時失效

2、緩存穿透

定義:

所需的數據在DB中就不存在

解決方案:

1:布隆過濾器(boomfilter) ,缺點是無法確保100%的準確

2:緩存空對象,缺點是會消耗很多內存

六、代碼設計注意項

1、設計查詢時走緩存的數據要符合業務邏輯

2、一般情形下,代碼中一定要保證查緩存時數據未查到或者出現異常,能夠正常去調用第三方或者直接查詢數據庫,排除上述用堆外緩存做最後一道容災的情形

3、緩存要按照業務邏輯設置時效性,持久的緩存可以設置定時任務去更新,臨時性的緩存失效後查詢時主動更新

4、業務邏輯不要依賴臨時緩存數據的準確性,還是應該去走數據庫

5、儲存用戶session的緩存信息redis需要固化,儲存其他業務的緩存信息的redis爲保證數據一致性可以選擇不固化。

6、高併發情形,緩存預熱非常有必要性

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章