讓我們通過一系列q&a來弄明白。
q:你期望網路伺服器都做些什麼事情?
a:在它監聽的埠上等待連線的到來,然後接收(accpet)它們。
q:呼叫accept會產生乙個描述符,我該怎麼處理它?
a:先儲存這個描述符,然後對它進行非阻塞(non-blocking)的讀寫(read/write)操作。
q:為什麼讀寫操作必須用非阻塞的方式呢?
a:如果伺服器阻塞在檔案(在unix世界socket也是檔案)i/o操作上,這期間它還怎麼處理其他連線的請求呢?
q:我想我必須在socket上做很多次非阻塞操作去看它什麼時候準備好,是這樣嗎?
a:是的,這就是事件庫為你所做的工作,現在你明白了。
q:那事件庫是怎麼做到的呢?
a:使用作業系統的輪詢(polling)機制以及定時器(timer)。
q:有沒有開源的事件庫能完成你說的這些功能?
a:當然有,libevent
和libev
就是這樣的事件庫。
q:redis用開源事件庫來處理socket i/o嗎?
a:不,因為一些原因redis使用自己的事件庫。
《Redis官方教程》 FAQ
為什麼redis不同於其他的鍵值儲存資料庫?有兩個主要原因 redis記憶體使用情況?舉幾個例子 所有資料基於64位例項 為了測試你的用例,使用redis benchmark工具生成隨機資料集,使用info memory命令檢查使用記憶體空間。儲存相同的鍵,64位系統比32位系統使用更多的記憶體,鍵...
Redis事件驅動庫《轉》
本文 事件驅動的程式設計方式已經很普及了,原因自然是網際網路的疾速膨脹,現在要寫個伺服器不用事件驅動,出門都不好意思跟人打招呼。但是實現事件庫並不是那 麼容易,首先它與人們亦步亦趨的思考方式有點兒衝突,其次事件庫的底層實現必須平台相關,如linux使用epoll,freebsd使用kqueue。事件...
Apache HttpCore官方教程筆記
httpcore是對http協議的基礎封裝的一套元件。乙個http訊息包含header和可選的body.請求頭 request header 由乙個請求行和一系列的頭字段組成。響應頭 response header 由乙個狀態行和一系列的頭字段組成。http訊息必須包含http版本。get http...