您好,登錄后才能下訂單哦!
本篇內容主要講解“Redis為什么要引入多線程”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Redis為什么要引入多線程”吧!
Redis 6.0 之后的版本拋棄了單線程模型這一設計,原本使用單線程運行的 Redis 也開始選擇性使用多線程模型,乍一看Redis的作者這么牛,也逃不過“真香定律”,
仔細想想,這個問題其實可以拆分,拆分為兩個主要的問題:
(1)為什么 Redis 一開始選擇單線程模型(單線程的好處)?
(2)為什么 Redis 在 6.0 之后加入了多線程(在某些情況下,單線程出現了缺點,多線程可以解決)?
其實,作者并不是沒有逃脫真香定理,而是隨著時間的推移,出現的問題也越來越多,原來的設計肯定就有些不合時宜,該做出改變就做出改變。OK,帶著倆問題,我們就來好好地分析一下。
不管是單線程或者是多線程都是為了提升Redis的開發效率,因為Redis是一個基于內存的數據庫,還要處理大量的外部的網絡請求,這就不可避免的要進行多次IO。好在Redis使用了很多優秀的機制來保證了它的高效率。那么為什么Redis要設計成單線程模式的呢?可以總結如下:
(1)IO多路復用
我們來看一下Redis頂層設計。
FD是一個文件描述符,意思是表示當前文件處于可讀、可寫還是異常狀態。使用 I/O 多路復用機制同時監聽多個文件描述符的可讀和可寫狀態。你可以理解為具有了多線程的特點。
一旦受到網絡請求就會在內存中快速處理,由于絕大多數的操作都是純內存的,所以處理的速度會非常地快。也就是說在單線程模式下,即使連接的網絡處理很多,因為有IO多路復用,依然可以在高速的內存處理中得到忽略。
(2)可維護性高
多線程模型雖然在某些方面表現優異,但是它卻引入了程序執行順序的不確定性,帶來了并發讀寫的一系列問題。單線程模式下,可以方便地進行調試和測試。
(3)基于內存,單線程狀態下效率依然高
多線程能夠充分利用CPU的資源,但對于Redis來說,由于基于內存速度那是相當的高,能達到在一秒內處理10萬個用戶請求,如果一秒十萬還不能滿足,那我們就可以使用Redis分片的技術來交給不同的Redis服務器。這樣的做飯避免了在同一個 Redis 服務中引入大量的多線程操作。
而且基于內存,除非是要進行AOF備份,否則基本上不會涉及任何的 I/O 操作。這些數據的讀寫由于只發生在內存中,所以處理速度是非常快的;用多線程模型處理全部的外部請求可能不是一個好的方案。
現在我們知道了基本上可以總結成兩句話,基于內存而且使用多路復用技術,單線程速度很快,又保證了多線程的特點。因為沒有必要使用多線程。
剛剛說了一堆使用單線程的好處,現在話鋒一轉,又要說為什么要引入多線程,別不適應。引入多線程說明Redis在有些方面,單線程已經不具有優勢了。
因為讀寫網絡的read/write系統調用在Redis執行期間占用了大部分CPU時間,如果把網絡讀寫做成多線程的方式對性能會有很大提升。
Redis 的多線程部分只是用來處理網絡數據的讀寫和協議解析,執行命令仍然是單線程。之所以這么設計是不想 Redis 因為多線程而變得復雜,需要去控制 key、lua、事務,LPUSH/LPOP 等等的并發問題。
Redis 在最新的幾個版本中加入了一些可以被其他線程異步處理的刪除操作,也就是我們在上面提到的 UNLINK
、FLUSHALL ASYNC
和 FLUSHDB ASYNC
,我們為什么會需要這些刪除操作,而它們為什么需要通過多線程的方式異步處理?
我們知道Redis可以使用del命令刪除一個元素,如果這個元素非常大,可能占據了幾十兆或者是幾百兆,那么在短時間內是不能完成的,這樣一來就需要多線程的異步支持。
現在刪除工作可以在后臺進行。
到此,相信大家對“Redis為什么要引入多線程”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。