什麼是緩存穿透、緩存擊穿、緩存雪崩以及怎麼解決

緩存穿透:

  • 描述

    一般的緩存系統,都是按照key去緩存查詢,如果不存在對應的value,就應該去數據庫查詢。一些惡意的請求會故意大量查詢不存在的key,就會對數據庫造成很大的壓力。這就叫做緩存穿透。 簡單的說就是故意避開緩存去數據庫查詢數據

  • 解決

    對查詢結果爲空的情況也進行緩存,緩存時間設置短一點。

緩存擊穿

  • 描述

    緩存擊穿是指緩存中沒有但數據庫中有的數據(一般是緩存時間到期),這時由於併發用戶特別多,同時讀緩存沒讀到數據,又同時去數據庫去取數據,引起數據庫壓力瞬間增大,造成過大壓力 。簡單地說就是緩存過期查詢數據庫

  • 解決方案

    1. 設置熱點數據永遠不過期。

    2. 分級緩存

    3. 加鎖

      	//原理:只允許一個線程訪問數據庫
          static Object lock = new Object();
       
          public List<String> getData02() {
              List<String> result = new ArrayList<String>();
              // 從緩存讀取數據
              result = getDataFromCache();
              if (result.isEmpty()) {
                  synchronized (lock) {
                      // 從數據庫查詢數據
                      result = getDataFromDB();
                      // 將查詢到的數據寫入緩存
                      setDataToCache(result);
                  }
              }
              return result;
          }
      

緩存雪崩

  • 描述

    緩存雪崩是指緩存中數據大批量到過期時間,而查詢數據量巨大,引起數據庫壓力過大甚至down機。和緩存擊穿不同的是, 緩存擊穿指併發查同一條數據,緩存雪崩是不同數據都過期了,很多數據都查不到從而查數據庫。簡單地說就是緩存大量過期去數據庫查詢數據

  • 解決方案

    1. 緩存數據的過期時間設置隨機,防止同一時間大量數據過期現象發生。
    2. 如果緩存數據庫是分佈式部署,將熱點數據均勻分佈在不同搞得緩存數據庫中。
    3. 設置熱點數據永遠不過期。

總結

  • 緩存穿透、緩存擊穿、緩存雪崩都是沒有使用到緩存直接訪問數據庫造成數據庫壓力過大。

  • 緩存穿透是故意避開緩存差數據庫;

  • 緩存擊穿是緩存到期大量連接訪問數據庫;

  • 緩存雪崩是大量緩存失效。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章