1. 程式人生 > 實用技巧 >快取粒度控制、快取穿透問題、快取擊穿.熱點key重建快取問題、快取雪崩問題

快取粒度控制、快取穿透問題、快取擊穿.熱點key重建快取問題、快取雪崩問題

快取粒度控制

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

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

快取穿透問題

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

可能造成原因:

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

危害:

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

解決方案 :

1.快取空物件

public class NullValueResultDO implements Serializable{
private static final long serialVersionUID = ‐6550539547145486005L;
}
public class UserManager {
UserDAO userDAO;
LocalCache localCache;
public UserDO getUser(String userNick) {
Object object = localCache.get(userNick);
if(object != null) {
if(object instanceof NullValueResultDO) {
return null;
}
return (UserDO)object;
} else {
User user = userDAO.getUser(userNick);
if(user != null) {
localCache.put(userNick,user);
} else {
localCache.put(userNick, new NullValueResultDO());
}
return user;
}
}
}

2.布隆過濾器

快取擊穿.熱點key重建快取問題

快取擊穿是指快取中沒有但資料庫中有的資料(一般是快取時間到期),這時由於併發使用者特別多,同時讀快取沒 讀到資料,又同時去資料庫去取資料,引起資料庫壓力瞬間增大,造成過大壓力 我們知道,使用快取,如果獲取不到,才會去資料庫裡獲取。但是如果是熱點 key,訪問量非常的大,資料庫在重 建快取的時候,會出現很多執行緒同時重建的情況。因為高併發導致的大量熱點的 key 在重建還沒完成的時候,不斷 被重建快取的過程,由於大量執行緒都去做重建快取工作,導致伺服器拖慢的情況。

解決方案

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

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

快取雪崩問題

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

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

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

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

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