更新緩存的的Design Pattern有四種:Cache aside, Read through, Write through, Write behind caching數據庫
這是最經常使用最經常使用的pattern了。其具體邏輯以下:後端
失效:應用程序先從cache取數據,沒有獲得,則從數據庫中取數據,成功後,放到緩存中。緩存
命中:應用程序從cache中取數據,取到後返回。併發
更新:先把數據存到數據庫中,成功後,再讓緩存失效。異步
失效和命中的示意圖:ide
更新的示意圖:性能
一個事實是,寫操做(更新操做)要比讀操做慢。spa
假設如今有兩個併發操做讀操做Read和更新操做Write,若是更新操做前就讓緩存失效。那麼Write還沒進行完,就有Read操做進來,這時Read先從緩存獲取數據而且沒有獲取到,那麼Read會直接把老數據OldData讀取出來後放到緩存中。然後Write更新了數據,數據變成了新的數據NewData。這時,就出現了緩存中的數據OldData和數據源中的數據NewData不一致的情形。而且Read操做一直能夠從緩存中獲取OldData,也無法對OldData進行更新了。操作系統
更新數據庫(Repository)的操做由緩存本身代理。應用認爲後端就是一個單一的存儲,而存儲本身維護本身的Cache。設計
Read Through 套路就是在查詢操做中更新緩存,也就是說,當緩存失效的時候(過時或LRU換出),Cache Aside是由調用方負責把數據加載入緩存,而Read Through則用緩存服務本身來加載,從而對應用方是透明的。
Write Through 套路和Read Through相仿,不過是在更新數據時發生。當有數據更新的時候,若是沒有命中緩存,直接更新數據庫,而後返回。若是命中了緩存,則更新緩存,而後再由Cache本身更新數據庫(這是一個同步操做)
下圖自來Wikipedia的Cache詞條。其中的Memory能夠理解爲就是例子裏的數據庫。
Write Behind 又叫 Write Back,更新數據的時候,只更新緩存,不更新數據庫,而緩存會異步地批量更新數據庫。
設計的好處就是讓數據的I/O操做飛 快無比(由於直接操做內存 ),由於異步,write backg還能夠合併對同一個數據的屢次操做,因此性能的提升是至關可觀的。
帶來的問題是,數據不是強一致性的,並且可能會丟失。
另外,Write Back實現邏輯比較複雜,由於他須要track有哪數據是被更新了的,須要刷到持久層上。操做系統的write back會在僅當這個cache須要失效的時候,纔會被真正持久起來,好比,內存不夠了,或是進程退出了等狀況,這又叫lazy write。