guava cache詳解

原文鏈接:https://www.cnblogs.com/ylz8401/p/9600502.html

轉載:https://www.jianshu.com/p/38bd5f1cf2f2
https://www.cnblogs.com/ylz8401/p/9600502.html
db(es)+localcahce+redis=緩存三層
https://baijiahao.baidu.com/s?id=1593604455239631609&wfr=spider&for=pc
比較複雜的數據不一致問題分析

問題:對於數據發生來變更,先刪除緩存,然後去修改數據庫,此時數據庫中的數據還沒有修改成功,併發的讀請求到來去讀緩存發現是空,進而去數據庫查詢到此時的舊數據放到緩存中,然後之前對數據庫數據的修改成功來,就會造成數據不一致

解決方案:將數據庫與緩存更新與讀取操作進行異步串行化。當更新數據的時候,根據數據的唯一標識,將更新數據操作路由到一個jvm內部的隊列中,一個隊列對應一個工作線程,線程串行拿到隊列中的操作一條一條地執行。當執行隊列中的更新數據操作,刪除緩存,然後去更新數據庫,此時還沒有完成更新的時候過來一個讀請求,讀到了空的緩存那麼可以先將緩存更新的請求發送至路由之後的隊列中,此時會在隊列積壓,然後同步等待緩存更新完成,一個隊列中多個相同數據緩存更新請求串在一起是沒有意義的,因此可以做過濾處理。等待前面的更新數據操作完成數據庫操作之後,纔會去執行下一個緩存更新的操作,此時會從數據庫中讀取最新的數據,然後寫入緩存中,如果請求還在等待時間範圍內,不斷輪詢發現可以取到緩存中值就可以直接返回(此時可能會有對這個緩存數據的多個請求正在這樣處理);如果請求等待事件超過一定時長,那麼這一次的請求直接讀取數據庫中的舊值

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