高併發設計系列 - 緩存篇

只有把抱怨環境的心情,化爲上進的力量,纔是成功的保證。——羅曼 · 羅蘭

1 Nginx/CDN

靜態數據利用 CDN 或者 Nginx 解決 動態數據利用分佈式緩存 redis 等解決

2 緩存讀寫策略

2.1 Cache Aside(旁路緩存) 策略

在更新數據的時候先更新 DB,在刪除緩存(想想爲什麼)。插入直接存儲到 DB,這樣查詢的時候先查詢緩存,緩存沒有,再從 db 查詢出來 set 到緩存,然後返回。

  1. 優點:緩存僅僅保存被請求的數據,屬於懶加載模式 (Lazy Loading),避免了任何數據都被寫入緩存造成緩存頻繁的更新。

  2. 缺點:當發生緩存未命中的情況時,則會比較慢,因爲要經過三個步驟:查詢緩存,從數據庫讀取,寫入緩存。

2.2 Read/Write Through 策略

用戶只與緩存打交道,由緩存和數據庫通信,寫入或者讀取數據。讀緩存,沒有,緩存會查詢 db 然後設置到緩存在返回。更新緩存,有就更新,緩存同步更新到 db。插入緩存更簡單,直接插入 db(write miss 的情況分兩種寫策略:要麼直接寫入 db,要麼寫入緩存,再有緩存更新到 db)。

  1. 優點:緩存不存在髒數據;相比較 Cache-Aside 懶加載模式,讀取速度更高,因爲較少因爲緩存未命中而從數據庫中查找

  2. 缺點:對於總是寫入卻很少被讀取的應用,那麼 Write-Through 會非常浪費性能,因爲數據可能更改了很多次,卻沒有被讀取,白白的每次都寫入緩存造成寫入延遲。

2.3 Write Back 策略

又叫做 Write-Behind。和 Write-Through 寫入的時機不同,Write-Back 將緩存作爲可靠的數據源,每次都只寫入緩存,而寫入數據庫則採用異步的方式,比如當數據要被移除出緩存的時候再存儲到數據庫或者一段時間之後批量更新數據庫。操作系統中比較常見。

  1. 優點:寫入和讀取數據都非常的快,因爲都是從緩存中直接讀取和寫入;對於數據庫不可用的情況有一定的容忍度,即使數據庫暫時不可用,系統也整體可用,當數據庫之後恢復的時候,再將數據寫入數據庫。

  2. 缺點:有數據丟失的風險,如果緩存掛掉而數據沒有及時寫到數據庫中,那麼緩存中的有些數據將永久的丟失了。

3 緩存高可用方案

  1. 客戶端方案;

  2. 中間代理方案 (codis);

  3. 服務端方案 (redis 哨兵);

4 緩存穿透

  1. 回種空值

  2. 布隆過濾器

5 CDN 加速靜態資源訪問

  1. DNS 技術

  2. GSLB 是核心解決 CDN 的利劍

6 關注公衆號

微信公衆號:堆棧 future

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/dPXcmCquR5nI74UeVyCoFQ