緩存模式
1) Cache Aside

更新方式
- 先更新資料庫,再更新緩存。這種做法最大的問題就是兩個并發的寫操作導緻髒資料。如下圖(以Redis和Mysql為例),兩個并發更新操作,資料庫先更新的反而後更新緩存,資料庫後更新的反而先更新緩存。這樣就會造成資料庫和緩存中的資料不一緻,應用程式中讀取的都是髒資料。
緩存模式【緩存使用幾種模式】【劉新宇】 - 先删除緩存,再更新資料庫。這個邏輯是錯誤的,因為兩個并發的讀和寫操作導緻髒資料。如下圖(以Redis和Mysql為例)。假設更新操作先删除了緩存,此時正好有一個并發的讀操作,沒有命中緩存後從資料庫中取出老資料并且更新回緩存,這個時候更新操作也完成了資料庫更新。此時,資料庫和緩存中的資料不一緻,應用程式中讀取的都是原來的資料(髒資料)。
緩存模式【緩存使用幾種模式】【劉新宇】 - 先更新資料庫,再删除緩存。這種做法其實不能算是坑,在實際的系統中也推薦使用這種方式。但是這種方式理論上還是可能存在問題。如下圖(以Redis和Mysql為例),查詢操作沒有命中緩存,然後查詢出資料庫的老資料。此時有一個并發的更新操作,更新操作在讀操作之後更新了資料庫中的資料并且删除了緩存中的資料。然而讀操作将從資料庫中讀取出的老資料更新回了緩存。這樣就會造成資料庫和緩存中的資料不一緻,應用程式中讀取的都是原來的資料(髒資料)。 但是,仔細想一想,這種并發的機率極低。因為這個條件需要發生在讀緩存時緩存失效,而且有一個并發的寫操作。實際上資料庫的寫操作會比讀操作慢得多,而且還要加鎖,而讀操作必需在寫操作前進入資料庫操作,又要晚于寫操作更新緩存,所有這些條件都具備的機率并不大。但是為了避免這種極端情況造成髒資料所産生的影響,我們還是要為緩存設定過期時間。
緩存模式【緩存使用幾種模式】【劉新宇】
2) Read-through 通讀
3) Write-through 通寫
4) Write-behind caching
多思考也是一種努力,做出正确的分析和選擇,因為我們的時間和精力都有限,是以把時間花在更有價值的地方。