快取穿透,是指查詢乙個資料庫一定不存在的資料。正常的使用快取流程大致是,資料查詢先進行快取查詢,如果key不存在或者key已經過期,再對資料庫進行查詢,並把查詢到的物件,放進快取。如果資料庫查詢物件為空,則不放進快取。
例如:從快取redis沒有命中,需要從mysql資料庫查詢,查不到資料則不寫入快取,這將導致這個不存在的資料每次請求都要到資料庫去查詢,造成快取穿透。
解決思路:
如果查詢資料庫也為空,直接設定乙個預設值存放到快取,這樣第二次到緩衝中獲取就有值了,而不會繼續訪問資料庫。設定乙個過期時間或者當有值的時候將快取中的值替換掉即可。
布隆過濾器
我們可以這樣考慮,可以先判斷key值是否存在,如果不存在,則不訪問redis,那這樣就可以攔截大量的請求,布隆過濾器恰好可以實現這樣的需求。
如果布隆過濾器判斷元素存在,則不一定存在,如果不存在,則一定不存在
快取擊穿,是指乙個key非常熱點,在不停的扛著大併發,大併發集中對這乙個點進行訪問,當這個key在失效的瞬間,持續的大併發就穿破快取,直接請求資料庫,就像在乙個屏障上鑿開了乙個洞。
解決思路:
使用互斥鎖 分布式鎖
設定熱點資料永遠不過期。
介面限流與熔斷,降級。重要的介面一定要做好限流策略,防止使用者惡意刷介面,同時要降級準備,當介面中的某些 服務 不可用時候,進行熔斷,失敗快速返回機制。
快取雪崩是指快取中資料大批量到過期時間,而查詢資料量巨大,引起資料庫壓力過大甚至down機。和快取擊穿不同的是,快取擊穿指併發查同一條資料,快取雪崩是不同資料都過期了,很多資料都查不到從而查資料庫。
解決方案:
快取資料的過期時間設定隨機,防止同一時間大量資料過期現象發生。
如果快取資料庫是分布式部署,將熱點資料均勻分布在不同搞得快取資料庫中。
設定熱點資料永遠不過期。
Redis快取穿透 快取擊穿 快取雪崩 解決方案
快取穿透 不斷請求快取和資料庫中都沒有的資料。黑客可以通過快取穿透使資料庫負載過大被壓垮,資料庫伺服器宕機。解決方案 校驗請求。如使用者id小於0,直接返回使用者不存在。設定key的value為 null 有效時長設定較小值,如30秒,防止資料庫中插入了資料,但快取不及時更新。利用布隆過濾器判斷請求...
快取穿透,快取擊穿,快取雪崩解決方案
快取穿透 快取穿透是指查詢乙個一定不存在的資料,由於快取是不命中時被動寫的,並且出於容錯考慮,如果從儲存層查不到資料則不寫入快取,這將導致這個不存在的資料每次請求都要到儲存層去查詢,失去了快取的意義。在流量大時,可能db就掛掉了,要是有人利用不存在的key頻繁攻擊我們的應用,這就是漏洞。解決方案 有...
快取穿透,快取擊穿,快取雪崩解決方案分析
設計乙個快取系統,不得不要考慮的問題就是 快取穿透 快取擊穿與失效時的雪崩效應。快取穿透是指查詢乙個一定不存在的資料,由於快取是不命中時被動寫的,並且出於容錯考慮,如果從儲存層查不到資料則不寫入快取,這將導致這個不存在的資料每次請求都要到儲存層去查詢,失去了快取的意義。在流量大時,可能db就掛掉了,...