Redis為什么這么快


今天我在一個技術群里提出一個問題:Redis為什么這么快,Redis的那些特性能夠支持了它的高並發?

之前的我,也只是知道Redis是內存數據庫,所以讀取速度快;IO使用的是多路復用,使用一個線程來輪詢描述符,減少了線程上下文的切換,將數據庫的開、關、讀、寫都轉化成了時間,所以IO時也有加速。雖然理解上就是這些(當然還有一些數據結構的原因,全程使用hash結構,加速讀寫)

    突然想寫下來,供大家看一下,也想請大神批評指正一下。

    Redis的高並發和快速原因很多,總結一下幾點:

        1. Redis是純內存數據庫,一般都是簡單的存取操作,線程占用的時間很多,時間的花費主要集中在IO上,所以讀取速度快。

        2. 再說一下IO,Redis使用的是非阻塞IO,IO多路復用,使用了單線程來輪詢描述符,將數據庫的開、關、讀、寫都轉換成了事件,減少了線程切換時上下文的切換和競爭。

        3. Redis采用了單線程的模型,保證了每個操作的原子性,也減少了線程的上下文切換和競爭。

        4. 另外,數據結構也幫了不少忙,Redis全程使用hash結構,讀取速度快,還有一些特殊的數據結構,對數據存儲進行了優化,如壓縮表,對短數據進行壓縮存儲,再如,跳表,使用有序的數據結構加快讀取的速度。

        5. 還有一點,Redis采用自己實現的事件分離器,效率比較高,內部采用非阻塞的執行方式,吞吐能力比較大。

     最后,附兩張圖,讓大家更加深刻的理解Redis的架構和內存模型:

               

                      

                                          Redis的工作流程圖

 

完全基於內存

      Redis是純內存數據庫,相對於讀寫磁盤,讀寫內存的速度就不是幾倍幾十倍了,一般,hash查找可以達到每秒百萬次的數量級。

 

多路復用IO

 

      “多路”指的是多個網絡連接,“復用”指的是復用同一個線程。采用多路 I/O 復用技術可以讓單個線程高效的處理多個連接請求(盡量減少網絡IO的時間消耗)。可以直接理解為:單線程的原子操作,避免上下文切換的時間和性能消耗;加上對內存中數據的處理速度,很自然的提高redis的吞吐量。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM