快取只是為了緩解資料庫壓力而新增的一層保護層,當從快取中查詢不到我們需要的資料就要去資料庫中查詢了。如果被黑客利用,頻繁去訪問快取中沒有的資料,那麼快取就失去了存在的意義,瞬間所有請求的壓力都落在了資料庫上,這樣會導致資料庫連線異常。
解決方案:
約定:對於返回為null的依然快取,對於丟擲異常的返回不進行快取,注意不要把拋異常的也給快取了。採用這種手段的會增加我們快取的維護成本,需要在插入快取的時候刪除這個空快取,當然我們可以通過設定較短的超時時間來解決這個問題。
制定一些規則過濾一些不可能存在的資料,小資料用bitmap,大資料可以用布隆過濾器,比如你的訂單id 明顯是在乙個範圍1-1000,如果不是1-1000之內的資料那其實可以直接給過濾掉。
快取雪崩是指快取不可用或者大量快取由於超時時間相同在同一時間段失效,大量請求直接訪問資料庫,資料庫壓力過大導致系統雪崩。
解決方案:
1、給快取加上一定區間內的隨機生效時間,不同的key設定不同的失效時間,避免同一時間集體失效。比如以前是設定10分鐘的超時時間,那每個key都可以隨機8-13分鐘過期,盡量讓不同key的過期時間不同。
2、採用多級快取,不同級別快取設定的超時時間不同,及時某個級別快取都過期,也有其他級別快取兜底。
3、利用加鎖或者佇列方式避免過多請求同時對伺服器進行讀寫操作。
快取雪崩和快取穿透
快取雪崩可能是因為資料未載入到快取中,或者快取同一時間大面積的失效,從而導致所有請求都去查資料庫,導致資料庫cpu和記憶體負載過高,甚至宕機。解決思路 1,採用加鎖計數,或者使用合理的佇列數量來避免快取失效時對資料庫造成太大的壓力。這種辦法雖然能緩解資料庫的壓力,但是同時又降低了系統的吞吐量。2,分...
快取穿透和快取雪崩
一 快取穿透 查詢乙個 必然不存在的資料,首先通過key到快取去查詢,不存在,然後到達db,這樣會對後台的db造成很大的壓力,這樣每次都會請求到達資料庫,這就是快取穿透 快取失效 如果快取集中在一段時間內失效,db的壓力凸顯 快取穿透避免的方法 1 最簡單粗暴的方法 如果在資料庫中查詢的也為null...
快取穿透和快取雪崩
也可以叫redis穿透和redis雪崩。redis是支援key value等多種資料結構的儲存系統,常用於快取。使用者進行查詢,發現redis記憶體資料庫中沒有資料,也就是快取沒有命中,就回去持久化層資料庫中進行查詢,發現也沒有,此次查詢失敗。當使用者過多,快取都沒有命中,每個都去持久化層資料庫中查...