《原神攻略》古時孤影二階段玩法介紹
快取穿透問題
什麼是快取穿透
快取穿透就是指當用戶在 Redis 快取系統查詢一條資料時,而 MySQL 資料庫和 Redis 快取裡卻沒有關於這條資料的任何記錄。這條資料在 Redis 快取中查詢不到自然會向 MySQL 資料庫請求獲取資料,MySQL 資料庫也獲取不到資料,導致 Redis 快取會一直查詢 MySQL 資料庫,這樣會對 MySQL 資料庫的訪問造成很大的壓力。
快取擊穿解決方案一:快取空物件
快取空物件是指使用者請求查詢 Redis 快取和 MySQL 資料庫中都不存在的資料時,MySQL 資料庫會返回一個空物件,並將這個空物件和使用者請求關聯起來存到 Redis 快取中;當存在相同使用者請求,這時 Redis 快取就會命中,就直接從快取中返回這個空物件,這樣可以減少訪問資料庫的壓力,提高當前資料庫的訪問效能。
優點
使用快取空物件機制原理和實現比較簡單(程式碼維護容易)
缺點
使用快取空物件長時間會導致 Redis 快取中存在大量空物件,不僅會佔用許多的記憶體空間,還會浪費許多資源(推薦設定快取空物件過期時間)
快取擊穿解決方案二:布隆過濾器(推薦)
布隆過濾器是一種過濾器,它的底層是一種基於概率的資料結構,主要使用來判斷當前某個元素是否在該集合中,執行速度快。但布隆過濾器不是絕對精確,會有小小的誤判概率,只要引數設定的合理,它的精確度可以控制的相對足夠精確
採用布隆過濾器,將所有可能存在的資料雜湊到一個足夠大的二進位制 bitmap 中,一個一定不存在的資料會被這個 bitmap 攔截掉,從而避免了對底層資料庫的查詢壓力
布隆過濾器還有很多其他應用,比如網路爬蟲去重複 URL 地址
快取擊穿問題
什麼是快取擊穿
快取擊穿是指 Redis 快取中有一些的熱點資料 key 同時過期失效,或有一些非熱點資料 key 突然有大量併發訪問請求,這樣會導致大量併發請求直接穿透 Redis 快取,湧入 MySQL 資料庫,瞬間增大資料庫的訪問壓力,甚至導致資料庫崩潰
快取擊穿解決方案一:永不過期
就是設定 key 永不過期,就不會出現大量 key 過期失效的問題, 優點是維護簡單,缺點是佔用空間。而卻對於非熱點資料的高併發訪問無效。
快取擊穿解決方案二:加鎖
對於 Redis 快取中 key 過期時,在 key 要查詢 MySQL 資料庫的時候加鎖,這時只能讓第一個請求進行查詢資料庫,然後把從資料庫中查詢到的值儲存到 Redis 快取中,對於其他的相同的 key 查詢,可以直接從 Redis 快取中獲取即可
快取雪崩問題
什麼是快取雪崩
快取雪崩是指在某一個時間段內,Redis 快取突然宕機或大量 key 集中過期失效,如果這個時間段內有大量請求,而查詢資料量巨大,所有的請求都會達到 MySQL 資料庫,資料庫的訪問量會暴增,引起資料庫壓力過大甚至宕機
快取雪崩解決方案
-
Redis 高可用
搭建 Redis 主從架構或叢集架構,負載均衡,分擔壓力
-
限流降級
在快取失效後,通過加鎖或者佇列來控制讀資料庫寫快取的執行緒數量,對某個 key 只允許一個執行緒查詢資料和寫快取,其他執行緒等待
-
資料預熱
將部分可能大量訪問的熱點資料提前載入到 Redis 快取中,或在即將發生高併發請求訪問前手動觸發載入快取不同的 key
-
不同的過期時間
設定不同的過期時間,讓快取失效的時間點儘量均勻