java高并发(二十一)高并发场景下缓存常见问题
緩存一致性
????當數據實時性要求很高時,需要保證緩存中的數據與數據庫中的數據一致,緩存節點與副本中的數據一致,不能出現差異現象,這就比較依賴緩存的過期和更新策略了。一般會在數據發生更改的時候,主動跟新緩存中的數據或者移除對應的緩存,這時可能會出現緩存一致性的問題。
? ? 現象一:更新數據庫成功,更新緩存失敗,數據不一致。
? ? 現象二:更新緩存成功,更新數據庫失敗,數據不一致。
? ? 現象三:更新數據庫成功,淘汰緩存失敗,數據不一致。
? ? 現象四:淘汰緩存成功,更新數據庫失敗,查詢緩存miss。
緩存并發問題
? ? 緩存過期后將嘗試從后端的數據庫獲取數據,這時一個看似合理的流程,但是在高并發場景下,有可能有多個請求從數據庫中請求數據,對后端數據庫造成極大的沖擊,甚至導致雪崩現象。此外當某個緩存的Key被更新時,同時也可能被大量請求獲取,這也會導致一致性的問題。如何避免類似的問題?可以通過鎖的機制來避免。在緩存更新或更新的情況下,先嘗試獲取鎖,當更新或者從數據庫獲取數據完成后,在釋放鎖。其他請求只要犧牲一定的等待時間就可以從緩存中繼續獲取數據。
緩存穿透問題
? ? 在高并發場景下,如果某個Key被高并發訪問,沒有被命中,出于對容錯性的考慮,會嘗試從后端數據庫中獲取,從而導致大量的請求達到數據庫,而該Key對應的數據本身就是空的情況下,就導致了數據庫中并發的去執行了很多不必要的查詢操作,從而導致了巨大的沖擊和壓力。這種情況下可以通過以下幾種方式來避免緩存穿透問題:
緩存的雪崩現象?
請求都到后臺數據庫導致系統崩潰
總結
以上是生活随笔為你收集整理的java高并发(二十一)高并发场景下缓存常见问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java高并发(二十)HashMap与C
- 下一篇: docker 安装mysql 5.7