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