PHP之缓存雪崩,及解决方法(转)
一、什么是緩存雪崩
緩存雪崩就是指緩存由于某些原因(比如 宕機、cache服務掛了或者不響應)整體crash掉了,導致大量請求到達后端數據庫,從而導致數據庫崩潰,整個系統崩潰,發生災難。
下面的就是一個雪崩的簡單過程:
1、redis集群徹底崩潰
2、緩存服務大量對redis的請求hang住,占用資源
3、緩存服務大量的請求打到源頭服務去查詢mysql,直接打死mysql
4、源頭服務因為mysql被打死也崩潰,對源服務的請求也hang住,占用資源
5、緩存服務大量的資源全部耗費在訪問redis和源服務無果,最后自己被拖死,無法提供服務
6、nginx無法訪問緩存服務,redis和源服務,只能基于本地緩存提供服務,但是緩存過期后,沒有數據提供
7、網站崩潰
通俗來講:就像雪崩一樣 你一個雪塊砸了下來 是不是剩下的都會持續下落 造成一種雪崩
導致這種現象可能的原因:
1、例如 “緩存并發”,“緩存穿透”,“緩存顛簸” 等問題,這些問題也可能會被惡意攻擊者所利用。
2、例如 某個時間點內,系統預加載的緩存周期性集中失效了。解決方法:可以通過設置不同的過期時間,來錯開緩存過期,從而避免緩存集中失效。
緩存穿透
緩存穿透,是指查詢一個數據庫一定不存在的數據。正常的使用緩存流程大致是,數據查詢先進行緩存查詢,如果key不存在或者key已經過期,再對數據庫進行查詢,并把查詢到的對象,放進緩存。如果數據庫查詢對象為空,則不放進緩存
緩存擊穿
緩存擊穿,是指一個key非常熱點,在不停的扛著大并發,大并發集中對這一個點進行訪問,當這個key在失效的瞬間,持續的大并發就穿破緩存,直接請求數據庫,就像在一個屏障上鑿開了一個洞。
解決的方案
緩存雪崩的解決方案
1,采用加鎖計數,或者使用合理的隊列數量來避免緩存失效時對數據庫造成太大的壓力。這種辦法雖然能緩解數據庫的壓力,但是同時又降低了系統的吞吐量。
2,分析用戶行為,盡量讓失效時間點均勻分布。避免緩存雪崩的出現。
3,如果是因為某臺緩存服務器宕機,可以考慮做主備,比如:redis主備,但是雙緩存涉及到更新事務的問題,update可能讀到臟數據,需要好好解決。
緩存穿透解決思路:
1,如果查詢數據庫也為空,直接設置一個默認值存放到緩存,這樣第二次到緩沖中獲取就有值了,而不會繼續訪問數據庫,這種辦法最簡單粗暴。
2,根據緩存數據Key的規則。例如我們公司是做機頂盒的,緩存數據以Mac為Key,Mac是有規則,如果不符合規則就過濾掉,這樣可以過濾一部分查詢。在做緩存規劃的時候,Key有一定規則的話,可以采取這種辦法。這種辦法只能緩解一部分的壓力,過濾和系統無關的查詢,但是無法根治。
3,采用布隆過濾器,將所有可能存在的數據哈希到一個足夠大的BitSet中,不存在的數據將會被攔截掉,從而避免了對底層存儲系統的查詢壓力。關于布隆過濾器,詳情查看:基于BitSet的布隆過濾器(Bloom Filter)
緩存預熱
單機web系統情況下比較簡單。
解決思路:
1,直接寫個緩存刷新頁面,上線時手工操作下。
2,數據量不大,可以在WEB系統啟動的時候加載。
3,搞個定時器定時刷新緩存,或者由用戶觸發都行。
分布式緩存系統,如Memcached,Redis,比如緩存系統比較大,由十幾臺甚至幾十臺機器組成,這樣預熱會復雜一些。
解決思路:
1,寫個程序去跑。
2,單個緩存預熱框架。
緩存預熱的目標就是在系統上線前,將數據加載到緩存中。
總結
以上是生活随笔為你收集整理的PHP之缓存雪崩,及解决方法(转)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MAC对于Excel表格换行操作
- 下一篇: 稀有金属股票,十大概念股名单一览