今天我在一個技術群里提出一個問題: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的吞吐量。