原文鏈接:http://www.cnblogs.com/zhenghongxin/p/8681168.html 什麼是驚群 首先,我們使用緩存的主要目的就是為了高併發情況下的高可用,換句話說,在使用了緩存的高併發的系統下,如果緩存突然都消失了,會發生什麼?首先資料庫的壓力必然驟增,接著負載迅速升高, ...
原文鏈接:http://www.cnblogs.com/zhenghongxin/p/8681168.html
什麼是驚群
首先,我們使用緩存的主要目的就是為了高併發情況下的高可用,換句話說,在使用了緩存的高併發的系統下,如果緩存突然都消失了,會發生什麼?首先資料庫的壓力必然驟增,接著負載迅速升高,響應時間變慢,進程/線程由於響應時間變慢導致集壓並劇增,這就是驚群。驚群的後果就是系統不可用甚至宕機。當然這是一個非常極端的例子,但是能很好的解釋驚群現象。真實環境中,可能會有個一些頁面是訪問非常頻繁的,如果這些頁面的緩存在同一時間或相近的時間突然過期了,在高併發的情況下也會產生驚群現象。
如何避免驚群
首先,避免緩存在同一時間過期;其次,如果緩存過期,不要讓所有併發的進程/線程都去觸發更新同一緩存數據。Nginx中使用mutex互斥鎖解決這個問題,具體措施有使用全局互斥鎖,每個子進程在epoll_wait()之前先去申請鎖,申請到則繼續處理,獲取不到則等待,並設置了一個負載均衡的演算法(當某一個子進程的任務量達到總設置量的7/8時,則不會再嘗試去申請鎖)來均衡各個進程的任務量。而redis我們也可以利用鎖的機制,來避免驚群!