Spring Boot--模板引擎thymeleaf
阿新 • • 發佈:2020-11-20
(2.1)什麼情況下快取和資料庫會不一致
在高併發的情況下,如果所有的資料都從資料庫中去讀取,那再強大的資料庫系統都承受不了這個壓力,因此我們會將部分資料放入快取中,比如放入redis中。這是典型的用空間換時間的方式。
但是這個redis相當於是真實資料的一個副本,這就意味著如果資料庫中資料發生變化的時候,就會導致快取資料不一致的問題。
歸根結底,只要有兩份資料存在,資料一致性問題就是不可避免的。
(2.2)解決方法一:資料實時更新
當更新資料庫的時候,同步更新快取。
優點:資料一致性強,不會出現快取雪崩的問題。
缺點:程式碼耦合度高,影響正常業務,增加一次網路開銷。
適用環境:適用於資料一致性要求高的場景,比如銀行業務,證券交易
(2.3)解決方法二:資料準實時更新
當更新資料庫的同時,非同步去更新快取,比如更新資料庫後把一條訊息傳送到mq中去實現。
優點:與業務解耦,不影響正常業務,不會出現快取雪崩。
缺點:有較短的延遲,並且無法保證最終的一致性,需要補償機制。
適用環境:寫操作不頻繁並且實時性要求不嚴格的場景。
(2.4)解決方法三:快取失效機制
基於快取本身的失效機制,具體實現方式為設定快取失效時間,如果有快取就從快取中取資料,如果沒快取就從資料庫中取資料,並且重新設定快取。
優點:實現方式簡單,與業務完美解耦,不影響正常業務。
缺點:有一定延遲,並且存在快取雪崩的情況。
適用環境:適合讀多寫少的網際網路環境,能接受一定的資料延時。
(2.5)解決方法四:定時任務更新
通過定時任務,按照一定時間間隔更新快取。
優點:不影響正常業務,在特殊場景應用廣泛。
缺點:不保證實時一致性,且需要為每個任務寫一個排程程式碼。
適用環境:適用於需要複雜資料統計的快取更新,比如展示高速車流量,五分鐘一次的統計不會影響業務使用。
(三)總結
關於快取一致性問題,需要具體場景具體分析,沒有任何一種方案可以應用於所有場景,上述四種方式也並非全部實現方式。