緩存一致性解決方案雜談


  緩存一致性的問題一直是比較困擾人的一個問題,接下來就和大家討論下緩存一致性的各種問題。

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM