快取穿透
快取穿透就是指當用戶在 Redis 快取系統查詢一條資料時,而 MySQL 資料庫和 Redis 快取里卻沒有關于這條資料的任何記錄,這條資料在 Redis 快取中查詢不到自然會向 MySQL 資料庫請求獲取資料,MySQL 資料庫也獲取不到資料,導致 Redis 快取會一直查詢 MySQL 資料庫,這樣會對 MySQL 資料庫的訪問造成很大的壓力

快取穿透解決方案一: 快取空物件
快取空物件
快取空物件是指用戶請求查詢 Redis 快取和 MySQL 資料庫中不存在的資料時,MySQL 資料庫會回傳一個空物件,并將這個空物件和用戶請求關聯起來存到 Redis 快取中;當存在相同用戶請求,這時 Redis 快取就會命中,就直接從快取中回傳這個空物件,這樣可以減少訪問資料庫的壓力,提高當前資料庫的訪問性能,
-
優點
使用快取空物件機制原理和實作比較簡單(代碼維護容易)
-
缺點
使用快取空物件長時間會導致 Redis 快取中存在大量空物件,不僅會占用許多的記憶體空間,還會浪費許多資源(推薦設定快取空物件過期時間)
redisCache.put(Integer.toString(id),null,60); //過期時間為60s

快取穿透解決方案二: 布隆過濾器(推薦)
布隆過濾器
布隆過濾器是一種過濾器,它的底層是一種基于概率的資料結構,主要使用來判斷當前某個元素是否在該集合中,運行速度快,但布隆過濾器不是絕對精確,會有小小的誤判概率,只要引數設定合理,它的精確度可以控制的相對足夠精確
解決方案
采用布隆過濾器,將所有可能存在的資料哈希到一個足夠大的二進制 bitmap 中,一個一定不存在的資料會被這個 bitmap 攔截掉,從而避免了對底層資料庫的查詢壓力
布隆過濾器在空間效率和查詢效率都非常高(不提供洗掉方法代碼維護比較困難)
快取擊穿
快取擊穿是指 Redis 快取中有一些的熱點資料 Key 同時過期失效,或有一些非熱點資料 Key 突然有大量并發訪問請求,這樣會導致大量并發請求直接穿透 Redis 快取,涌入 MySQL 資料庫,瞬間增大資料庫的訪問壓力,甚至導致資料庫崩潰

快取擊穿解決方案一: 永不過期
永 不 過 期
快取擊穿解決方案二: 加鎖
加鎖
對于 Redis 快取中 key 過期時,在 Key 要查詢 MySQL 資料庫的時候加鎖,這時只能讓第一個請求進行查詢資料庫,然后把資料庫中查詢到的值存盤到 Redis 快取中,對于其他的相同的 Key 查詢,可以直接從 Redis 快取中獲取即可

快取雪崩
快取雪崩是指在某一個時間段內,Redis 快取突然宕機或大量 Key 集中過期失效,如果這個時間段內有大量請求,而查詢資料量巨大,所有的請求都會達到 MySQL 資料庫,資料庫的訪問量會暴增,引起資料庫壓力過大甚至宕機
快取雪崩解決方案
-
Redis 高可用
搭建 Redis 主從架構或集群架構
-
限流降級
在快取失效后,通過加鎖或者佇列來控制讀資料庫寫快取的執行緒數量,對某個 Key 只允許一個執行緒查詢資料和寫快取,其他執行緒等待
-
資料預熱
將部分可能大量訪問的熱點資料提前加載到 Redis 快取中,或在即將發生高并發請求訪問前手動觸發加載快取不同的 Key
-
不同的過期時間
設定不同的過期時間,讓快取失效的時間點盡量均勻
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/212124.html
標籤:大數據
