Redis單線程解讀

來源:互聯網
上載者:User

標籤:資料庫   互動   記憶體資料庫   事件通知   安全   進程   時間   自動   建立   

  之前面試時被面試官問了一個問題,Redis是多線程還是單線程的?依稀記得Redis為單線程,其更深層次的技術原理完全懵逼。所以此篇文章旨在解讀Redis為什麼為單線程。

1、基本原理 
採用多路 I/O 複用技術可以讓單個線程高效的處理多個串連請求(盡量減少網路IO的時間消耗) 
(1)為什麼不採用多進程或多執行緒?

多執行緒可能涉及到鎖 
多執行緒會涉及到線程切換而消耗CPU

(2)單線程處理的缺點?

無法發揮多核CPU效能,不過可以通過在單機開多個Redis執行個體來完善

2、Redis不存線上程安全問題? 
Redis採用了線程封閉的方式,把任務封閉在一個線程,自然避免了安全執行緒問題,不過對於需要依賴多個redis操作的複合操作來說,依然需要鎖,而且有可能是分布式鎖

3、什麼是多路I/O複用(Epoll) 
(1) 網路IO都是通過Socket實現,Server在某一個連接埠持續監聽,用戶端通過Socket(IP+Port)與伺服器建立串連(ServerSocket.accept),成功建立串連之後,就可以使用Socket中封裝的InputStream和OutputStream進行IO互動了。針對每個用戶端,Server都會建立一個新線程專門用於處理 
(2) 預設情況下,網路IO是阻塞模式,即伺服器線程在資料到來之前處於【阻塞】狀態,等到資料到達,會自動喚醒伺服器線程,著手進行處理。阻塞模式下,一個線程只能處理一個流的IO事件 
(3) 以下三種思路

(1)非阻塞【忙輪詢】:採用死迴圈方式輪詢每一個流,如果有IO事件就處理,這樣可以使得一個線程可以處理多個流,但是效率不高,容易導致CPU空轉

(2)Select代理(無差別輪詢):可以觀察多個流的IO事件,如果所有流都沒有IO事件,則將線程進入阻塞狀態,如果有一個或多個發生了IO事件,則喚醒線程去處理。但是還是得遍曆所有的流,才能找出哪些流需要處理。如果流個數為N,則時間複雜度為O(N)

(3)Epoll代理:Select代理有一個缺點,線程在被喚醒後輪詢所有的Stream,還是存在無效操作。 Epoll會哪個流發生了怎樣的I/O事件通知處理線程,因此對這些流的操作都是有意義的,複雜度降低到了O(1)

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

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

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

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

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

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

Redis單線程解讀

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.