附redis關於緩存雪崩和緩存穿透,熱點key
穿透
穿透:頻繁查詢一個不存在的數據,由於緩存不命中,每次都要查詢持久層。從而失去緩存的意義。
解決辦法: 持久層查詢不到就緩存空結果,查詢時先判斷緩存中是否exists(key) ,如果有直接返回空,沒有則查詢后返回,
注意insert時需清除查詢的key,否則即便DB中有值也查詢不到(當然也可以設置空緩存的過期時間)
雪崩
雪崩:緩存大量失效的時候,引發大量查詢數據庫。
解決辦法:①用鎖/分布式鎖或者隊列串行訪問
②緩存失效時間均勻分布
熱點key
熱點key:某個key訪問非常頻繁,當key失效的時候有打量線程來構建緩存,導致負載增加,系統崩潰。
解決辦法:
①使用鎖,單機用synchronized,lock等,分布式用分布式鎖。
②緩存過期時間不設置,而是設置在key對應的value里。如果檢測到存的時間超過過期時間則異步更新緩存。
③在value設置一個比過期時間t0小的過期時間值t1,當t1過期的時候,延長t1並做更新緩存操作。
4設置標簽緩存,標簽緩存設置過期時間,標簽緩存過期后,需異步地更新實際緩存 具體參照userServiceImpl4的處理方式
總結
一、查詢redis緩存時,一般查詢如果以非id方式查詢,建議先由條件查詢到id,再由id查詢pojo
二、異步kafka在消費端接受信息后,該怎么識別處理那張表,調用哪個方法,此問題暫時還沒解決
三、比較簡單的redis緩存,推薦使用canal
參考文檔
http://blog.csdn.net/fly_time2012/article/details/50751316
http://blog.csdn.net/kkgbn/article/details/60576477
http://www.cnblogs.com/fidelQuan/p/4543387.html