更新時間:2020-04-20 15:23:29 來源:動力節點 瀏覽2264次
雙線程的程序可以支持每秒幾百萬的請求量,眾所周知,Redis作為被廣泛使用的內存數據庫偏偏選擇了單線程模型,這又是為什么呢?其實簡單概括起來主要有以下三個原因,方便維護,可以并發的處理任務以及雙線程不能解決Redis的性能瓶頸。下面我們來仔細分析一下Redis選擇單線程模型的原因。
原因一:單線程模型更方便維護
相信我們都了解可維護性對一個項目的重要性,而Redis使用單線程模型能帶來更好的可維護性,方便開發和調試。如果代碼難以調試和測試,問題也經常難以復現,這對于任何一個項目來說都會嚴重地影響項目的可維護性。多線程模型雖然在某些方面表現優異,但是它卻引入了程序執行順序的不確定性,代碼的執行過程不再是串行的,多個線程同時訪問的變量如果沒有謹慎處理就會帶來詭異的問題。而多線程帶來的問題是很明顯的,如果計算機中的兩個進程(線程同理)同時嘗試修改一個共享內存的內容,在沒有并發控制的情況下,最終的結果依賴于兩個進程的執行順序和時機,如果發生了并發訪問沖突,最后的結果就會是不正確的。
原因二:可以并發的處理任務。
雖然,Redis選擇了單線程模型,但是這也不影響它能并發的處理客戶端的請求。Redis服務中運行的絕大多數操作的性能瓶頸都不是CPU。用單線程模型也并不意味著程序不能并發的處理任務,Redis雖然使用單線程模型處理用戶的請求,但是它卻使用I/O多路復用機制并發處理來自客戶端的多個連接,同時等待多個連接發送的請求。在I/O多路復用模型中,最重要的函數調用就是select以及類似函數,該方法的能夠同時監控多個文件描述符(也就是客戶端的連接)的可讀可寫情況,當其中的某些文件描述符可讀或者可寫時,select方法就會返回可讀以及可寫的文件描述符個數。使用I/O多路復用技術能夠極大地減少系統的開銷,系統不再需要額外創建和維護進程和線程來監聽來自客戶端的大量連接,減少了服務器的開發成本和維護成本
原因三:雙線程不能解決Redis的性能瓶頸
這也是Redis選擇單線程模型的最核心的原因。雖然多線程技術的能夠幫助我們充分利用CPU的計算資源來并發的執行不同的任務,但是CPU資源往往都不是Redis服務器的性能瓶頸。哪怕我們在一個普通的Linux服務器上啟動Redis服務,它也能在1s的時間內處理1,000,000個用戶請求。
如果這種吞吐量不能滿足我們的需求,更推薦的做法是使用分片的方式將不同的請求交給不同的Redis服務器來處理,而不是在同一個Redis服務中引入大量的多線程操作。所以Redis并不是CPU密集型的服務,如果不開啟AOF備份,所有Redis的操作都會在內存中完成不會涉及任何的I/O操作,這些數據的讀寫由于只發生在內存中,所以處理速度是非常快的;整個服務的瓶頸在于網絡傳輸帶來的延遲和等待客戶端的數據傳輸,也就是網絡I/O,所以使用多線程模型處理全部的外部請求可能不是一個好的方案。
以上就是動力節點java培訓機構的小編針對“Java數據庫開發教程,Redis選擇單線程模型”的內容進行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業老師隨時為你服務。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習