快取穿透是指查詢乙個一定不存在的資料,由於快取是不命中時需要從資料庫查詢,查不到資料則不寫入快取,這將導致這個不存在的資料每次請求都要到資料庫去查詢,造成快取穿透。
如果快取集中在一段時間內失效,發生大量的快取穿透,所有的查詢都落在資料庫上,造成了快取雪崩。這個沒有完美解決辦法,但可以分析使用者行為,盡量讓失效時間點均勻分布。大多數系統設計者考慮用加鎖或者佇列的方式保證快取的單執行緒(程序)寫,從而避免失效時大量的併發請求落到底層儲存系統上。
解決方法
在快取失效後,通過加鎖或者佇列來控制讀資料庫寫快取的執行緒數量。比如對某個key只允許乙個執行緒查詢資料和寫快取,其他執行緒等待。可以通過快取reload機制,預先去更新快取,再即將發生大併發訪問前手動觸發載入快取
不同的key,設定不同的過期時間,讓快取失效的時間點盡量均勻
做二級快取,或者雙快取策略。a1為原始快取,a2為拷貝快取,a1失效時,可以訪問a2,a1快取失效時間設定為短期,a2設定為長期。
Redis 穿透和雪崩
就是訪問redis中乙個不存在的key的時候,會直接穿過快取,去資料庫中進行查詢.如果是黑客,進行惡意攻擊的時候,每次都請求超過2000個 秒的時候,這個時候mysql基本上就掛了.解決辦法是 每次從資料庫中查詢到乙個不存在的key的時候,就寫乙個空值到快取庫中,有惡意攻擊的時候,直接從快取中取到這...
Redis雪崩和Redis穿透
redis雪崩 查詢時redis沒有資料本來先從redis裡面查某個資料 但是redis中這個資料剛好被刪除了,還沒來得及更新 一瞬間很多請求直接進入了mysql進行查詢 而mysql承受不了太大壓力,就會出現雪崩redis穿透 跳過我們預想的資料本來先從redis裡面查某個資料 但是redis中沒...
redis的穿透和雪崩
redis穿透 正常的執行路徑是這樣的,請求資料,首先會從redis快取中拿資料,如果快取沒有的話才去查資料庫,再寫到redis快取中。那麼如果有人請求一條根本不存在的資料時,redis裡面肯定沒有嘛,它就會去訪問資料庫,但是資料庫沒有,所以它也沒把資料寫回redis快取。所以它每次請求這個資料的時...