常用的快取問題及解決方案

2021-09-28 20:14:27 字數 1329 閱讀 4675

快取問題

1、常用的快取有 :

cache aside:快取中無資料,從資料庫中讀取,讀取完成後返回使用者並加入快取。

存在的問題是:如果兩個操作,乙個讀操作,快取未命中,從資料讀取資料,加入快取。這是在乙個寫操作:更新了資料,清空了快取。

但是第乙個讀操作的再把老資料寫入資料庫。就造成了髒資料。

read-throug:當應用系統向快取系統請求資料時(例如使用key=x向快取請求資料);

如果快取中並沒有對應的資料存在(key=x的value不存在),快取系統將向底層資料來源的讀取資料,檢索資料後,快取會自行更新並將資料返回給呼叫應用程式。

如果資料在快取中存在(命中key=x),則直接返回快取中存在的資料。這就是所謂的read-throug。

write-through

當資料發生更新的時候,先去cache裡面進行更新,如果命中了,則先更新快取再由cache方來更新database。如果沒有命中的話,就直接更新cache裡面的資料。

write-behind :先將資料寫入到快取裡面,然後再非同步的寫入到database中進行資料同步。

這樣的設計既可以直接的減少我們對於資料的database裡面的直接訪問,降低壓力,同時對於database的多次修改可以進行合併操作,極大的提公升了系統的承載能力。

但是這種模式處理快取資料具有一定的風險性,例如說當cache機器出現宕機的時候,資料會有丟失的可能。

2、快取穿透問題

什麼是快取穿透:

大量的請求再快取沒有命中的情況下,去請求後台資料庫。這種叫做快取穿透。

照成的後果:

大量的資料庫查詢操作,會增加資料庫的壓力。最終導致資料庫無法承載客戶端請求壓力。出現宕機,卡死等現象。

常用的解決方案:

1、空值快取:

2、布隆過濾器:

把db的資料制定key預存到布隆過濾器中,如果請求key在布隆過濾器中存在,再去快取中取資料,如果快取中無資料,再請求db。

3、快取雪崩

什麼是快取雪崩:

快取雪崩是指大量的快取在某一時間段內失效,這時候也會導致大量的請求到後台資料庫。

快取雪崩的解決方案:

1、加分布式鎖:請求過來時加分布式鎖,只有持有鎖的請求,出去請求後台資料庫,然後加入到快取中,釋放鎖。別的請求就可以從快取中獲取資料,從而避免大量的db請求

但是這種做法有一定的弊端,過多的讀請求執行緒堵塞,將機器記憶體佔滿,依然沒有能夠從根本上解決問題。

2、預啟動:在併發場景發生前,把資料快取起來。以減少應用第一次請求對db的壓力。資料過期時間設定盡量分散開來,以避免出現同一時間段大量快取失效

3、使用二級快取:分布式快取+本地快取。

4、hystrix限流&降級

快取穿透問題及解決方案

快取穿透也被稱為 擊穿 很多朋友對快取穿透的理解是 由於快取故障或者快取過期導致大量請求穿透到後端資料庫伺服器,從而對資料庫造成巨大衝擊。這其實是一種誤解。真正的快取穿透應該是這樣的 在高併發場景下,如果某乙個key被高併發訪問,沒有被命中,出於對容錯性考慮,會嘗試去從後端資料庫中獲取,從而導致了大...

快取相關問題及解決方案

快取穿透 查詢必然不存在的資料,請求透過快取,直擊資料庫 快取雪崩 大量的key設定了相同的過期時間,導致在快取在同一時刻全部失效,造成瞬時db請求量大 壓力驟增,引起雪崩 快取擊穿 乙個存在的key,在快取過期的一刻,同時有大量的請求。直擊資料庫順便說兩個概念加深一下記憶 tps 資料庫美妙執行的...

ajax 快取問題及解決方案

當請求的路徑 引數名 引數值三者都沒有發生變化時,瀏覽器將不會再傳送此請求,只有這三者其中任意乙個發生變化時 變化的一般只有引數值 瀏覽器才會再次向伺服器傳送請求!快取測試 總共四次請求 文字框中沒有值 http localhost 8070 demo getjson.do?operation 請求...