快取雪崩
資料未載入到快取中,或者快取同一時間大面積的失效,從而導致所有請求都去查資料庫,導致資料庫cpu和記憶體負載過高,甚至宕機。
比如乙個雪崩的簡單過程:
1、redis集群大面積故障
2、快取失效,但依然大量請求訪問快取服務redis
3、redis大量失效後,大量請求轉向到mysql資料庫
4、mysql的呼叫量暴增,很快就扛不住了,甚至直接宕機
5、由於大量的應用服務依賴mysql和redis的服務,這個時候很快會演變成各伺服器集群的雪崩,最後**徹底崩潰。
快取雪崩解決方案
1、快取的高可用性
快取層設計成高可用,防止快取大面積故障。即使個別節點、個別機器、甚至是機房宕掉,依然可以提供服務,例如 redis sentinel 和 redis cluster 都實現了高可用。
2、快取降級
可以利用ehcache等本地快取(暫時使用),但主要還需要對源服務訪問進行限流、資源隔離(熔斷)、降級等。
當訪問量劇增、服務出現問題仍然需要保證服務還是可用的。系統可以根據一些關鍵資料進行自動降級,也可以配置開關實現人工降級,這裡會涉及到運維的配合。
降級的最終目的是保證核心服務可用,即使是有損的。
3、redis備份和快速預熱
1)redis資料備份和恢復
2)快速快取預熱
4、避免快取集中失效,不同的key設定不同的超時時間
快取穿透
快取穿透是指查詢乙個一不存在的資料。例如:從快取redis沒有命中,需要從mysql資料庫查詢,查不到資料則不寫入快取,這將導致這個不存在的資料每次請求都要到資料庫去查詢,造成快取穿透。
解決思路
如果查詢資料庫也為空,直接設定乙個預設值存放到快取,這樣第二次到緩衝中獲取就有值了,而不會繼續訪問資料庫。設定乙個過期時間或者當有值的時候將快取中的值替換掉即可。
可以給key設定一些格式規則,然後查詢之前先過濾掉不符合規則的key。
快取預熱
快取預熱就是系統上線後,將相關的快取資料直接載入到快取系統。
這樣就可以避免在使用者請求的時候,先查詢資料庫,然後再將資料快取的問題,使用者直接查詢事先被預熱的快取資料。
Redis快取穿透 快取雪崩
把redis作為快取使用已經是司空見慣,但是使用redis後也可能會碰到一系列的問題,尤其是資料量很大的時候,經典的幾個問題如下 一 快取和資料庫間資料一致性問題 分布式環境下 單機就不用說了 非常容易出現快取和資料庫間的資料一致性問題,針對這一點的話,只能說,如果你的專案對快取的要求是強一致性的,...
Redis 快取穿透 快取雪崩
目錄 1.快取穿透 如何避免?如何選擇?2 快取擊穿 如何解決 3.快取雪崩 如何解決?快取穿透 一般的快取系統,都是按照key去快取查詢,如果不存在對應的value,就應該去後端系統查詢 比如db 一些惡意的請求會故意查詢不存在的key,請求量很大,就會對後端系統造成很大的壓力,或導致資料庫異常。...
redis快取穿透 快取雪崩
什麼是快取雪崩 在同一時間內大量的快取資料失效,大量的請求都會去資料庫查詢,造成快取雪崩。解決方法 這個沒有完美的解決方法,但是可以分析使用者行為,盡量讓失效時間點均勻分布,還有就是在快取失效後,通過加鎖或者佇列來控制讀資料庫寫快取的執行緒數量,比如對某國key只允許乙個執行緒查詢資料庫和快取,其他...