緩存穿透
場景:用戶查詢數(shù)據(jù)庫中沒有的數(shù)據(jù),這樣不論如何都不會寫入緩存,請求量一大對數(shù)據(jù)庫也不是很友好
解決方法:
- 緩存無效Key
- 布隆過濾器
緩存雪崩
場景:并發(fā)量很大的情況下,大量數(shù)據(jù)同時(shí)過期,在那一瞬間,數(shù)據(jù)庫壓力暴增
解決方案:
- 在過期時(shí)間基礎(chǔ)上添加隨機(jī)數(shù)
- 設(shè)置數(shù)據(jù)永不過期,新開一個(gè)線程完成更新
緩存擊穿
場景:某個(gè)訪問量極大的數(shù)據(jù),在過期瞬間,所有訪問量打進(jìn)數(shù)據(jù)庫,給數(shù)據(jù)庫造成極大壓力
解決方案:
- 設(shè)置數(shù)據(jù)永不過期,新開一個(gè)線程完成更新
- 對大量的訪問線程進(jìn)行阻塞攔截,只放一個(gè)線程與數(shù)據(jù)庫進(jìn)行交互,并寫入緩存中
緩存與數(shù)據(jù)庫一致性問題
如何保證緩存與數(shù)據(jù)庫的一致性?
- 先操作緩存,將緩存緩存特殊值,當(dāng)用戶查到特殊值時(shí)則進(jìn)入休眠,但是對業(yè)務(wù)有入侵性;
- 延遲雙刪:先刪緩存,再寫數(shù)據(jù)庫,再刪緩存
- 先寫數(shù)據(jù)庫再刪緩存
- 邏輯上設(shè)置過期時(shí)間,另開線程刷新緩存,刪除邏輯上過期的key