redis的伺服器程式採用的是單程序,單執行緒的模型來處理客戶端的請求。對讀寫等事件的響應是通過對epoll函式的包裝來做到的。
下圖是整個伺服器模型原理圖。
首先我們來說明下整個伺服器初始化的過程:
1.初始化aseventloop。
2.初始化伺服器socket監聽,並且繫結accepttcphandler事件函式,以應對建立客戶端連線的請求。
3.繫結beforesleep函式到eventloop,並且呼叫aemain來啟動epoll主迴圈。
4.主迴圈響應客戶端要求建立連線的請求。
5.主迴圈讀取客戶端命令,並執行。
6.如有資料回寫則初始化化writeevent,將資料提交到c-replay佇列。主迴圈需要處理此事件的時候則讀取資料寫回客戶端。
由此可見redis的實際實際處理速度完全依靠主迴圈的執行效率。假如同時有多個客戶端併發訪問伺服器,則伺服器處理能力在一定情況下將會下降,下面用實際的測試過程來說明。
由於我的測試資料是在模擬器下的虛擬機器中的出來的,所以沒有實際的生產環境參考價值,只是用來說明模型與併發處理能力之間的關係。
先看下客戶端連線數分別為1,10,50,橫座標為客戶端併發執行緒數,縱座標為服務端實際吞吐量大小。
再來看下響應時間
由此可見:
1.當服務端併發連線客戶端越多,它的實際吞吐量是呈下降趨勢。
2.除去1個連線的時候由於客戶端併發執行緒競爭1個連線資源的開銷外,其他情況下,服務端響應客戶端時間均比較穩定。
結論:
1.由於伺服器採用單程序單執行緒的模型,伺服器實際響應客戶請求其實是先來後到的序列模式,只要伺服器演算法ok,那麼單個請求響應時間絕對ok。
2.假如你要提公升伺服器的併發能力,那麼可以採用在單台機器部署多個redis程序的方式。
大小: 72.1 kb
大小: 25.3 kb
大小: 22.9 kb
redis伺服器模型分析
redis的伺服器程式採用的是單程序,單執行緒的模型來處理客戶端的請求。對讀寫等事件的響應是通過對epoll函式的包裝來做到的。下圖是整個伺服器模型原理圖。img 首先我們來說明下整個伺服器初始化的過程 1.初始化aseventloop。2.初始化伺服器socket監聽,並且繫結accepttcph...
伺服器模型
伺服器模型 1 迴圈伺服器模型 tcp 迴圈伺服器 udp 迴圈伺服器 2 併發伺服器 tcp 併發伺服器 父子程序實現併發伺服器 父親程序 接收請求。accept 兒子程序 處理具體客戶端需求。send recv 注意點 殭屍程序,父親活著,兒子死亡,父親沒有為兒子程序收屍,會產生殭屍程序。避免殭...
伺服器模型
在使用socket進行網路程式設計時,首先要選擇乙個合適的伺服器模型是很重要的。在網路程式裡,通常都是乙個伺服器服務多個客戶機,為了處理多個客戶機的請求,伺服器端的程式有不同的處理方式。迭代模型算是最早期的伺服器模型,其核心實現是每來乙個使用者,然後為這個使用者服務到底,過程中不接受任何新的使用者請...