快取擊穿 快取併發和快取失效

2021-08-10 10:04:30 字數 1057 閱讀 8797

1、快取穿透

專案中使用快取通常都是先檢查快取中是否存在,如果存在直接返回快取內容,如果不存在就直接查詢資料庫然後再快取查詢結果返回。

遇到問題:

如果我們查詢的某乙個資料在快取中一直不存在,就會造成每一次請求都查詢db,這樣快取就失去了意義,在流量大時,可能db就掛掉了。

要是有人利用不存在的key頻繁攻擊我們的應用,這就是漏洞。

解決辦法:

有乙個比較巧妙的作法是,可以將這個不存在的key預先設定乙個值,比如,"key" , 「&&」。

在返回這個&&值的時候,我們的應用就可以認為這是不存在的key,那我們的應用就可以決定是否繼續等待繼續訪問,還是放棄掉這次操作。

如果繼續等待訪問,過乙個時間輪詢點後,再次請求這個key,如果取到的值不再是&&,則可以認為這時候key有值了,從而避免了透傳到資料庫,從而把大量的類似請求擋在了快取之中。

二、快取併發

遇到問題:

有時候如果**併發訪問高,乙個快取如果失效,可能出現多個程序同時查詢db,同時設定快取的情況,如果併發確實很大,這也可能造成db壓力過大,還有快取頻繁更新的問題。

解決辦法:

我現在的想法是對快取查詢加鎖,如果key不存在,就加鎖,然後查db入快取,然後解鎖;其他程序如果發現有鎖就等待,然後等解鎖後返回資料或者進入db查詢。

這種情況和剛才說的預先設定值問題有些類似,只不過利用鎖的方式,會造成部分請求等待。

三、快取失效

引起這個問題的主要原因還是高併發的時候,平時我們設定乙個快取的過期時間時,可能有一些會設定1分鐘啊,5分鐘這些,併發很高時可能會出在某乙個時間同時生成了很多的快取,

並且過期時間都一樣,這個時候就可能引發一當過期時間到後,這些快取同時失效,請求全部**到db,db可能會壓力過重。

那如何解決這些問題呢?

其中的乙個簡單方案就時講快取失效時間分散開,比如我們可以在原有的失效時間基礎上增加乙個隨機值,比如1-5分鐘隨機,這樣每乙個快取的過期時間的重複率就會降低,就很難引發集體失效的事件。

快取擊穿 快取併發和快取雪崩

快取擊穿 快取併發和快取雪崩是常見的由於併發量大而導致的快取問題。快取擊穿通常是由惡意攻擊或者無意造成的 快取併發是由設計不足造成的 快取雪崩是由快取同時失效造成的,三種問題都比較典型,也是難以防範和解決的。快取擊穿 快取擊穿指的是使用不存在的key進行大量的高併發查詢,這導致快取無法命中,每次請求...

快取擊穿和快取雪崩

前台請求,後台先從快取中取資料,取到直接返回結果,取不到時從資料庫中取,資料庫取到更新快取,並返回結果,資料庫也沒取到,那直接返回空結果。描述 快取穿透是指快取和資料庫中都沒有的資料,而使用者不斷發起請求,如發起為id為 1 的資料或id為特別大不存在的資料。這時的使用者很可能是攻擊者,攻擊會導致資...

快取穿透,快取雪崩和快取擊穿

q 快取穿透,是指查詢乙個資料庫一定不存在的資料。正常的使用快取流程大致是,資料查詢先進行快取查詢,如果key不存在或者key已經過期,再對資料庫進行查詢,並把查詢到的物件,放進快取。如果資料庫查詢物件為空,則不放進快取。a 1.布隆過濾器,將所有可能存在的資料雜湊到乙個足夠大的bitmap中,乙個...