Redis高性能模型
一、引言
Redis是基於單進程單線程模型的,即對於客戶端的所有讀寫等請求的處理,都由一個主線程串列地處理。因此當多個客戶端同時對一個鍵進行寫操作不會有並發問題。
我們知道Redis Server不僅處理客戶端讀寫等請求,還有一些自身的比較複雜且耗時的操作,如持久化RDB和AOF文件等。Redis為了高效的處理客戶端的事件,並沒有將持久化文件放在主線程裡面進行處理,而是Redis在適當的時機fork子進程來非同步的處理這種任務。
Redis會fork子進程進行處理持久化文件操作,Redis還有一組非同步任務處理線程,用於處理不需要主線程同步處理的工作,即處理一些低級別的事件。
二、Redis單進程單線程
上面我們提到Redis中非同步任務處理線程,其被封裝在BIO組件中。下面我們來看下bio.h,bio.c
從上述的代碼中,可以看到BIO有三種類型的線程,分別處理三種類型的事件:
文件句柄關閉
AOF持久化
空間懶釋放
三、Redis的高性能
在實際應用,我們經常會採用高性能軟體Memcached、Nginx。然而Memcached、Nginx的高性能採用了不同的處理模型,Memcached是單進程多線程模型,Nginx是多進程單線程模型。
Redis的高性能又是如何做到的哪?
我們可以從如下幾個方面分析:
絕大部分操作是基於純粹的內存
相對簡單的數據結構,Redis全程使用hash結構,讀取速度快;還有一些特殊的數據結構,對數據存儲進行了優化,如壓縮表,對數據進行壓縮存儲;再如跳錶,使用有序的數據結構加快讀取的速度
單線程避免不必要的上線文切換及競爭條件
I/O多路復用模型
旨在解決IO的問題。多路I/O復用模型是非阻塞IO,內部實現採用epoll和自己實現的事件分離框架。
其利用select、poll、epoll 可以同時檢測多個流的 I/O 事件的能力,在空閑的時候,會把當前線程阻塞掉,當有一個或多個流有 I/O 事件時,就從阻塞態中喚醒,於是程序就會輪詢一遍所有的流(epoll 是只輪詢那些真正發出了事件的流),並且只依次順序的處理就緒的流,這種做法就避免了大量的無用操作。
「多路」指的是多個網路連接,「復用」指的是復用同一個線程。採用多路 I/O 復用技術可以讓單個線程高效的處理多個連接請求(盡量減少網路 IO 的時間消耗),且 Redis 在內存中操作數據的速度非常快(內存內的操作不會成為這裡的性能瓶頸)。
以上幾點使Redis具有很高的吞吐量。
Redis工作流程
四、小結
Redis單進程單線程模型高性能得益於Redis的非同步化組件,其處理策略是將主要的工作由主線程處理,非主要工作交於子進程和非同步線程組處理;在一定程度上降低了主線程的壓力,進而提高了吞吐量。
非核心邏輯非同步化,提高主進程的處理效率。
五、參考
http://blog.jobbole.com/103012/
點擊展開全文


※40歲的程序員你該怎麼辦?
※使用 C+的StringBuilder 提升 4350% 的性能
※Java後台開發精選知識圖譜
※Java開發中異常處理的最佳實踐
TAG:程序源 |
※Garmin Instinct本能系列新品 打造高顏值高性能城市機能風
※TARS為Spring Cloud 提供高性能的 RPC 能力
※塑造高性能越野性格 APR賦予Volkswagen Atlas 350匹強勁實力
※高性能計算Lustre性能優化方案
※高性能深度學習支持引擎實戰——TensorRT
※華為MateBook D體驗:高顏值高性能 其實還能更優秀
※高性能Chromebook曝光
※ThinkPad X1 隱士高性能輕薄本:高性能小鋼炮
※杉岩統一存儲推出SandStone AgileStore高性能引擎
※FAIR開源Tensor Comprehensions,讓機器學習與數學運算高性能銜接
※FAIR 開源 Tensor Comprehensions,讓機器學習與數學運算高性能銜接
※Netty-整合Protobuf高性能數據傳輸
※Moi Composites推出適用於3D列印高性能零件的CFM工藝
※Corsair推出高性能PC ATX機箱
※MySQL使用JPA+Hibernate的9個高性能技巧
※蘋果神秘高性能設備現身Geekbench
※Synaptics前總裁Rick Bergman加盟AMD:助力高性能PC、遊戲和半定製業務
※Spark Connected為AR/VR發布高性能線充電解決方案The Griffin
※Facebook構建高性能Android視頻組件實踐之路
※Oculus研發Half Dome原型機揭示致力於開發高性能VR頭顯