2016-03-01 18:56 2615人閱讀 評論(0) 收藏 舉報mysql
分類:redis
Java(60) sql
緩存雪崩多是由於數據未加載到緩存中,或者緩存同一時間大面積的失效,從而致使全部請求都去查數據庫,致使數據庫CPU和內存負載太高,甚至宕機。緩存
解決思路:服務器
1,採用加鎖計數,或者使用合理的隊列數量來避免緩存失效時對數據庫形成太大的壓力。這種辦法雖然能緩解數據庫的壓力,可是同時又下降了系統的吞吐量。併發
2,分析用戶行爲,儘可能讓失效時間點均勻分佈。避免緩存雪崩的出現。spa
3,若是是由於某臺緩存服務器宕機,能夠考慮作主備,好比:Redis主備,可是雙緩存涉及到更新事務的問題,update可能讀到髒數據,須要好好解決。.net
緩存穿透是指用戶查詢數據,在數據庫沒有,天然在緩存中也不會有。這樣就致使用戶查詢的時候,在緩存中找不到,每次都要去數據庫中查詢。blog
解決思路:
1,若是查詢數據庫也爲空,直接設置一個默認值存放到緩存,這樣第二次到緩衝中獲取就有值了,而不會繼續訪問數據庫,這種辦法最簡單粗暴。
2,根據緩存數據Key的規則。例如咱們公司是作機頂盒的,緩存數據以Mac爲Key,Mac是有規則,若是不符合規則就過濾掉,這樣能夠過濾一部分查詢。在作緩存規劃的時候,Key有必定規則的話,能夠採起這種辦法。這種辦法只能緩解一部分的壓力,過濾和系統無關的查詢,可是沒法根治。
3,採用布隆過濾器,將全部可能存在的數據哈希到一個足夠大的BitSet中,不存在的數據將會被攔截掉,從而避免了對底層存儲系統的查詢壓力。關於布隆過濾器,詳情查看:基於BitSet的布隆過濾器(Bloom Filter)
大併發的緩存穿透會致使緩存雪崩。