描述
查詢乙個資料庫中不存在的資料,比如商品詳情,查詢乙個不存在的id,每次都會訪問db,如果有人惡意破壞,很可能直接對db造成過大地壓力。
解決方案
當通過某乙個key去查詢資料的時候,如果對應在資料庫中的資料都不存在,我們將此key對應的value設定為乙個預設的值,比如「null」,並設定乙個快取的失效時間,這時在快取失效之前,所有通過此key的訪問都被快取擋住了。後面如果此key對應的資料在db中存在時,快取失效之後,通過此key再去訪問資料,就能拿到新的value了。
描述
如果當快取伺服器重啟或快取集中在一段時間內失效,發生大量的快取穿透,所有的查詢都落在資料庫上,造成了快取雪崩。
解決方案
可以分析使用者行為,不同的key,設定不同的過期時間,盡量讓失效時間點均勻分布。
在快取失效後,通過加鎖或者佇列來控制讀資料庫寫快取的執行緒數量。比如對某個key只允許乙個執行緒查詢資料和寫快取,其他執行緒等待。
做二級快取,或者雙快取策略。a1為原始快取,a2為拷貝快取,a1失效時,可以訪問a2,a1快取失效時間設定為短期,a2設定為長期。
描述
快取預熱就是系統上線後,提前將相關的快取資料直接載入到快取系統。避免在使用者請求的時候,先查詢資料庫,然後再將資料快取的問題!使用者直接查詢事先被預熱的快取資料!
解決方案
直接寫個快取重新整理頁面,上線時手工操作下;
資料量不大,可以在專案啟動的時候自動進行載入;
描述
有時候如果**併發訪問高,乙個快取如果失效,可能出現多個程序同時查詢db,同時設定快取的情況,如果併發確實很大,這也可能造成db壓力過大,還有快取頻繁更新的問題。
解決方案
在快取失效後,通過加鎖或者佇列來控制讀資料庫寫快取的執行緒數量。比如對某個key只允許乙個執行緒查詢資料和寫快取,其他執行緒等待。
描述
在高併發的環境下,如果此時key對應的快取失效,此時有多個程序就會去同時去查詢db,然後再去同時設定快取。這個時候如果這個key是系統中的熱點key或者同時失效的數量比較多時,db訪問量會瞬間增大,造成過大的壓力。
解決方案
將系統中key的快取失效時間均勻地錯開,防止統一時間點有大量的key對應的快取失效;
重新設計快取的使用方式,當我們通過key去查詢資料時,首先查詢快取,如果此時快取中查詢不到,就通過分布式鎖進行加鎖,取得鎖的程序查db並設定快取,然後解鎖;其他程序如果發現有鎖就等待,然後等解鎖後返回快取資料或者再次查詢db。
快取併發和快取失效可以看做是將快取雪崩拆分成了兩個
Redis快取問題
快取雪崩就是 redis 的大量熱點資料在短時間內同時過期 失效 因為設定了相同的過期時間,剛好這個時候 redis 請求的併發量又很大,就會導致所有的請求到資料庫。快取雪崩解決方案 1.加互斥鎖或者使用佇列,針對同乙個key只允許乙個執行緒到資料庫查詢 2.快取定時預先更新,避免同時失效 3.通過...
Redis快取問題
1.快取雪崩 快取雪崩是指快取同一時間大面積的失效,所以後面的請求都會落到資料庫上,造成資料庫短時間內承受大量請求而崩掉。解決方案 快取資料過期時間隨機設定,防止同一時間大量資料過期現象發生。併發量不是特別多的時候,加鎖排隊。給每乙個快取資料新增乙個標價,記錄快取是否失效,如果失效,則更新資料快取。...
Redis快取穿透 快取雪崩問題
穿透雪崩主要是因為查詢資料庫造成的,那麼讀寫分離,快取資料查詢失敗不去查資料庫就好了。查的時候有即是有,無即是無,不會再查資料庫,快取的穿透和雪崩問題就不存在了。其次新增資料庫和快取同步功能,保證資料庫和快取資料是一致的即可 需要注意的是這時候資料庫資料是有限和相對穩定的,其實如果是海量資料同時放入...