陳皓-緩存更新的經典設計模式

總--下面的都是方法論,理論。至於具體實現,各個緩存產品本身定

更新緩存的的Design Pattern有四種:Cache aside, Read through, Write through, Write behind caching數據庫

Cache Aside Pattern

這是最經常使用最經常使用的pattern了。其具體邏輯以下:後端

    失效:應用程序先從cache取數據,沒有獲得,則從數據庫中取數據,成功後,放到緩存中。緩存

    命中:應用程序從cache中取數據,取到後返回。併發

更新:先把數據存到數據庫中,成功後,再讓緩存失效。異步

失效和命中的示意圖:ide

更新的示意圖:性能

若是更新時先讓緩存失效,再更新數據,下次讀取時再將數據更新到緩存中能否?

一個事實是,寫操做(更新操做)要比讀操做慢。spa

假設如今有兩個併發操做讀操做Read和更新操做Write,若是更新操做前就讓緩存失效。那麼Write還沒進行完,就有Read操做進來,這時Read先從緩存獲取數據而且沒有獲取到,那麼Read會直接把老數據OldData讀取出來後放到緩存中。然後Write更新了數據,數據變成了新的數據NewData。這時,就出現了緩存中的數據OldData和數據源中的數據NewData不一致的情形。而且Read操做一直能夠從緩存中獲取OldData,也無法對OldData進行更新了。操作系統

Read/Write Through Pattern

更新數據庫(Repository)的操做由緩存本身代理。應用認爲後端就是一個單一的存儲,而存儲本身維護本身的Cache。設計

Read Through

Read Through 套路就是在查詢操做中更新緩存,也就是說,當緩存失效的時候(過時或LRU換出),Cache Aside是由調用方負責把數據加載入緩存,而Read Through則用緩存服務本身來加載,從而對應用方是透明的。

Write Through

Write Through 套路和Read Through相仿,不過是在更新數據時發生。當有數據更新的時候,若是沒有命中緩存,直接更新數據庫,而後返回。若是命中了緩存,則更新緩存,而後再由Cache本身更新數據庫(這是一個同步操做)

下圖自來Wikipedia的Cache詞條。其中的Memory能夠理解爲就是例子裏的數據庫。

Write Behind Caching Pattern

Write Behind 又叫 Write Back,更新數據的時候,只更新緩存,不更新數據庫,而緩存會異步地批量更新數據庫。

設計的好處就是讓數據的I/O操做飛 快無比(由於直接操做內存 ),由於異步,write backg還能夠合併對同一個數據的屢次操做,因此性能的提升是至關可觀的。

帶來的問題是,數據不是強一致性的,並且可能會丟失。

另外,Write Back實現邏輯比較複雜,由於他須要track有哪數據是被更新了的,須要刷到持久層上。操做系統的write back會在僅當這個cache須要失效的時候,纔會被真正持久起來,好比,內存不夠了,或是進程退出了等狀況,這又叫lazy write。

★四種緩存更新模式的總結

Cache Aside Pattern--應用來操做和維護緩存和數據源的一致性

Read/Write Through Pattern--應用認爲後端就是一個單一的存儲,而存儲本身維護本身的Cache

Write Behind Caching Pattern(Write Back)--更新數據的時候,只更新緩存,不更新數據庫,緩存會異步地批量更新數據庫

相關文章
相關標籤/搜索