緩存穿透:
-
描述
一般的緩存系統,都是按照key去緩存查詢,如果不存在對應的value,就應該去數據庫查詢。一些惡意的請求會故意大量查詢不存在的key,就會對數據庫造成很大的壓力。這就叫做緩存穿透。 簡單的說就是
故意避開緩存去數據庫查詢數據
。 -
解決
對查詢結果爲空的情況也進行緩存,緩存時間設置短一點。
緩存擊穿
-
描述
緩存擊穿是指緩存中沒有但數據庫中有的數據(一般是緩存時間到期),這時由於併發用戶特別多,同時讀緩存沒讀到數據,又同時去數據庫去取數據,引起數據庫壓力瞬間增大,造成過大壓力 。簡單地說就是
緩存過期查詢數據庫
。 -
解決方案
-
設置熱點數據永遠不過期。
-
分級緩存
-
加鎖
//原理:只允許一個線程訪問數據庫 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機。和緩存擊穿不同的是, 緩存擊穿指併發查同一條數據,緩存雪崩是不同數據都過期了,很多數據都查不到從而查數據庫。簡單地說就是
緩存大量過期去數據庫查詢數據
。 -
解決方案
- 緩存數據的過期時間設置隨機,防止同一時間大量數據過期現象發生。
- 如果緩存數據庫是分佈式部署,將熱點數據均勻分佈在不同搞得緩存數據庫中。
- 設置熱點數據永遠不過期。
總結
-
緩存穿透、緩存擊穿、緩存雪崩都是沒有使用到緩存直接訪問數據庫造成數據庫壓力過大。
-
緩存穿透是故意避開緩存差數據庫;
-
緩存擊穿是緩存到期大量連接訪問數據庫;
-
緩存雪崩是大量緩存失效。