spymemcached 是一個 memcached 的客戶端, 使用 NIO 實現。採用Reactor模式實現,單線程,高性能Memcached客戶端。 java
spymemcached源碼分析:http://my.oschina.net/astute/blog/93492 react
所謂reactor模式,實際上是event-driven pattern在網絡服務設計中的應用,以平衡CPU與IO速率,最大化CPU資源與IO資源的利用率; tomcat
先來看看經典的服務器設計: 服務器
經典網絡服務接受客戶端請求,響應請求過程能夠抽象爲如下步驟: 網絡
網絡服務全部動做被抽象爲這個五個步驟的handler;可能每一個handler有單獨線程執行,或者由一個線程順序執行; 多線程
這種經典設計中存在如下問題: 異步
爲了解決上述問題,採用兩個方法實現: memcached
採用事件處理模式的單線程Reactor模式: 源碼分析
單線程Reactor 處理 鏈接請求,全部用戶請求都在同一個線程中;經過IO事件觸發相應的操做;IO事件觸發機制可參考java nio機制; 性能
單線程版本的Reactor模式,還有如下問題:
爲解決上述問題,採用多線程設計方案的Reactor模式:
多線程版本的Reactor模式,有如下優點:
reactor模式就介紹到此,具體看下spymemcached中reactor模式的應用吧
spymemcached中reactor模式設計到如下概念:
工做線程職責:
IO線程職責:
因而可知,spymemcached Reactor模式實現中,工做線程至關於客戶端請求; IO線程至關於單線程Reactor設計中的Reactor負責接收請求,處理請求;spymemcached對數據解碼部分能夠擴展實現線程池方式提供解碼計算,無需佔用Reactor線程資源,使得Reactor線程滿負荷IO操做和事件觸發;
在spymemcached的Reactor設計中:
MemcachedClient負責接收請求
MemcachedConnection負責處理IO請求
同時還能夠擴展支持線程池TranscodeService對解碼計算提供異步線程支持; 這也是OperationFuture.get()返回值仍未一個Futrue,內部再次調用future.get返回最終數據的緣由。