Redis快取三大問題解析

2021-10-01 02:16:19 字數 1410 閱讀 2905

通俗來講,快取粒度問題就是我們在使用快取時,是將所有資料快取還是快取部分資料?

快取粒度問題是乙個容易被忽視的問題,如果使用不當,可能會造成很多無用空間的浪費,可能會造成網路頻寬的浪費,可能會造成**通用性較差等情況,必須學會綜合資料通用性、空間占用比、**維護性 三點評估取捨因素權衡使用。

快取穿透是指查詢乙個一定不存在的資料,由於快取不命中,並且出於容錯考慮, 如果從儲存層查不到資料則不寫入快取,這將導致這個不存在的資料每次請求都要到儲存層去查詢,失去了快取的意義。

1.業務**自身問題 2.惡意攻擊。爬蟲等等

對底層資料來源壓力過大,有些底層資料來源不具備高併發性。  例如mysql一般來說單台能夠扛1000-qps就已經很不錯了

1.快取空物件

public class nullvalueresultdo implements serializable

public class usermanager

return (userdo)object;

} else else

return user;

}}          

}

2.布隆過濾器

快取擊穿是指快取中沒有但資料庫中有的資料(一般是快取時間到期),這時由於併發使用者特別多,同時讀快取沒讀到資料,又同時去資料庫去取資料,引起資料庫壓力瞬間增大,造成過大壓力

我們知道,使用快取,如果獲取不到,才會去資料庫裡獲取。但是如果是熱點 key,訪問量非常的大,資料庫在重建快取的時候,會出現很多執行緒同時重建的情況。因為高併發導致的大量熱點的 key 在重建還沒完成的時候,不斷被重建快取的過程,由於大量執行緒都去做重建快取工作,導致伺服器拖慢的情況。

1.互斥鎖

第一次獲取快取的時候,加乙個鎖,然後查詢資料庫,接著是重建快取。這個時候,另外乙個請求又過來獲取快取,發現有個鎖,這個時候就去等待,之後都是一次等待的過程,直到重建完成以後,鎖解除後再次獲取快取命中。

public string getkey(string key)else

} return value;

}

互斥鎖的優點是思路非常簡單,具有一致性,但是互斥鎖也有一定的問題,就是大量執行緒在等待的問題。存在死鎖的可能性。

快取雪崩是指機器宕機或在我們設定快取時採用了相同的過期時間,導致快取在某一時刻同時失效,請求全部**到db,db瞬時壓力過重雪崩。

1:在快取失效後,通過加鎖或者佇列來控制讀資料庫寫快取的執行緒數量。比如對某個key只允許乙個執行緒查詢資料和寫快取,其他執行緒等待。

2:做二級快取,a1為原始快取,a2為拷貝快取,a1失效時,可以訪問a2,a1快取失效時間設定為短期,a2設定為長期

3:不同的key,設定不同的過期時間,讓快取失效的時間點盡量均勻。

4:如果快取資料庫是分布式部署,將熱點資料均勻分布在不同的快取資料庫中。

談談redis快取三大問題(二) 快取雪崩

今天抽時間和大家聊聊redis的雪崩以及redis集群的演變過程。首先來說說什麼是redis的快取雪崩。如圖是乙個比較常見的業務流程圖,先去看快取是否存在,如果存在返回,如果不存在直接查資料庫,並更新快取。一般在設定快取的時候,都會去設定乙個失效時間,防止無用快取占用大量記憶體。常見的快取雪崩分為兩...

Redis三大問題 快取穿透 快取擊穿 快取雪崩

快取擊穿 快取雪崩 前台請求,後台先從快取中取資料,取到直接返回結果,取不到時從資料庫中取,資料庫取到更新快取,並返回結果,資料庫也沒取到,直接返回空結果。快取穿透就是當使用者訪問一條資料時,快取和資料庫中都不存在,就會不斷的發起請求。如果使用者是攻擊者,會導致資料庫壓力過大。解決方案 快取空物件 ...

快取常見三大問題

之前常聽人說,但是沒有仔細想過這些問題。最近看 可伸縮服務架構 架構與中介軟體 中這些問題解釋的很好,也給出了一般解決方案,記錄一下。快取穿透 快取併發 快取雪崩常見的由於併發量大而導致。說明 快取穿透指的是使用不存在的key進行大量的高併發查詢,這導致快取無法命中,每次請求都要穿透到後端資料庫系統...