緩存一致性的問題一直是比較困擾人的一個問題,接下來就和大家討論下緩存一致性的各種問題。
1.1 為什么使用緩存
在互聯網電商公司,對於數據的讀取是非常頻繁的。磁盤IO的瓶頸會限制在高並發請求的有效響應,因此此刻使用離內存更近的存儲方式是減少數據傳輸時間,提高效率的有效和最常用的方式,這種方式就是緩存。
使用緩存不僅減少了請求的響應時間,而且降低了后端服務器的壓力,提升了用戶的體驗。
1.2 緩存帶來的問題
凡事皆有利就有弊,在高並發的場景下會帶來以下幾個問題:
緩存一致性:緩存數據和DB數據不一致,依賴於緩存的過期時間和更新緩存的策略。
緩存並發:高並發情況下,讀取緩存不存在,去讀取數據庫,此刻未寫入緩存是另一線程並發讀取回直接打到數據庫上。造成緩存並發,可以通過互斥鎖解決。
緩存穿透:查詢了一個不存在的數據,緩存不存在則讀取DB,造成每次必定訪問DB。可以通過短時間緩存空數據返回解決。
緩存雪崩:緩存部分熱點的數據key,由於在同一時間失效導致大量請求訪問DB。比較簡單的一種方式是在固定時間的基礎上加上隨機數時間解決。
1.3 緩存一致性解決方案:
緩存一致性的問題很重要的一點就是:在得知DB數據發生的變化后寫入緩存
方式一:
1.通過業務同時更新DB和緩存
2.更新DB成功,開始更新緩存。更新DB失敗,直接失敗。
3.更新緩存成功,成功返回。
4.更新緩存失敗,數據發送到MQ
5.監聽MQ消息,繼續更新緩存。
方式二: 依賴binlog
1.業務更新數據庫,更新MySql binlog日志。
2.獲取mySql日志,轉換為數據發送至MQ。
3.業務方監聽MQ消息,根據標識更新緩存。
沒有最好的解決方案,只有各自適合業務的解決方案。
參考文檔:關於緩存穿透以及簡單的處理方式 https://www.jianshu.com/p/400dd82389b4?from=groupmessage
參考文檔:緩存在高並發場景下該如何處理問題 https://www.jianshu.com/p/99216e67612c
參考文檔:分布式緩存一致性https://blog.csdn.net/koli6678/article/details/88202245