redis驚群

hongxinerke發表於2018-03-31

本文連結:http://www.cnblogs.com/zhenghongxin/p/8681168.html

什麼是驚群

首先,我們使用快取的主要目的就是為了高併發情況下的高可用,換句話說,在使用了快取的高併發的系統下,如果快取突然都消失了,會發生什麼?首先資料庫的壓力必然驟增,接著負載迅速升高,響應時間變慢,程式/執行緒由於響應時間變慢導致集壓並劇增,這就是驚群。驚群的後果就是系統不可用甚至當機。當然這是一個非常極端的例子,但是能很好的解釋驚群現象。真實環境中,可能會有個一些頁面是訪問非常頻繁的,如果這些頁面的快取在同一時間或相近的時間突然過期了,在高併發的情況下也會產生驚群現象。

如何避免驚群

首先,避免快取在同一時間過期;其次,如果快取過期,不要讓所有併發的程式/執行緒都去觸發更新同一快取資料。Nginx中使用mutex互斥鎖解決這個問題,具體措施有使用全域性互斥鎖,每個子程式在epoll_wait()之前先去申請鎖,申請到則繼續處理,獲取不到則等待,並設定了一個負載均衡的演算法(當某一個子程式的任務量達到總設定量的7/8時,則不會再嘗試去申請鎖)來均衡各個程式的任務量。而redis我們也可以利用鎖的機制,來避免驚群!

 

 

相關文章