中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Redis的線程模型是什么

發布時間:2021-12-31 16:54:58 來源:億速云 閱讀:142 作者:iii 欄目:大數據

本篇內容介紹了“Redis的線程模型是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

1、面試題

Redis和Memcached有什么區別?

Redis的線程模型是什么?

為什么Redis是單線程的但是還可以支撐高并發?

2、面試官心理分析

問這個的時候就是問你Redis的原理了,看你是不是思考過,研究過。Redis最基本的一個內部原理和特點,就是Redis實際上是個單線程工作模型。你要是連這個都不知道,那后面在使用Redis的時候,如果出了問題豈不是什么都不知道,無從下手?

還有可能面試官會問問你Redis和Memcached的區別。不過說實話,近幾年,面試官都不太喜歡這么問了。因為memcached是早些年各大互聯網公司常用的緩存方案,但是現在近幾年基本都是Redis,沒什么公司用memcached了。

3、溫馨提醒

如果你要是現在還不知道redis和memcached是啥,那你趕緊百度一下redis入門和memcahced入門,找兩篇博客教程什么的簡單啟動一下,然后試一下幾個簡單操作,先感受一下,跟這個博客跟著教程做個demo程序,1小時以內就搞定了,就能初步了解和入門了。然后接著回來繼續看。

另外一個友情提示,要弄明白redis的線程模型的話,前提是你需要了解socket網絡相關的基本知識。如果你socket都不了解的話那我覺得你java沒學好吧。初學者都該學習java的socket網絡通信相關知識的。

 

4、面試題剖析

(1)redis和memcached有啥區別

這個問題,其實可以比較出很多區別,但是這里還是采取redis作者給出的幾個來進行比較吧,畢竟面試不是背博客,不是說的越多越好,你只要答出來關鍵的那幾點其實就可以了。但是并不是說除了這里列出來的幾個你就不需要知道別的了,你可以說:要說二者的區別其實還挺多的,這里我就挑幾個最典型的說吧。

1)Redis支持服務器端的數據操作:Redis相比Memcached來說,擁有更多的數據結構和并支持更豐富的數據操作,通常在Memcached里,你需要將數據拿到客戶端來進行類似的修改再set回去。這大大增加了網絡IO的次數和數據體積。在Redis中,這些復雜的操作通常和一般的GET/SET一樣高效。所以,如果需要緩存能夠支持更復雜的結構和操作,那么Redis會是不錯的選擇。

2)內存使用效率對比:使用簡單的key-value存儲的話,Memcached的內存利用率更高,而如果Redis采用hash結構來做key-value存儲,由于其組合式的壓縮,其內存利用率會高于Memcached。

3)性能對比:由于Redis只使用單核,而Memcached可以使用多核,所以平均每一個核上Redis在存儲小數據時比Memcached性能更高。而在100k以上的數據中,Memcached性能要高于Redis,雖然Redis最近也在存儲大數據的性能上進行優化,但是比起Memcached,還是稍有遜色。

4)集群模式:memcached沒有原生的集群模式,需要依靠客戶端來實現往集群中分片寫入數據;但是redis目前是原生支持cluster模式的,redis官方就是支持redis cluster集群模式的,比memcached來說要更好。

其實第2、3個說不說都可以,關鍵是1和4。

 
(2)redis的線程模型

問這個原理性的問題,其實你可以結合著圖來給面試官講這個問題,邊畫圖邊講最有說服力,面試官在心里會給你默默地豎起大拇指。

Redis的線程模型是什么

1)文件事件處理器

Redis基于Reactor模式開發了網絡事件處理器,這個處理器叫做文件事件處理器 file event handler。這個文件事件處理器,它是單線程的,所以 Redis 才叫做單線程的模型,它采用IO多路復用機制來同時監聽多個Socket,根據Socket上的事件類型來選擇對應的事件處理器來處理這個事件。

如果被監聽的 Socket 準備好執行accept、read、write、close等操作的時候,跟操作對應的文件事件就會產生,這個時候文件事件處理器就會調用之前關聯好的事件處理器來處理這個事件。

文件事件處理器是單線程模式運行的,但是通過IO多路復用機制監聽多個Socket,可以實現高性能的網絡通信模型,又可以跟內部其他單線程的模塊進行對接,保證了 Redis 內部的線程模型的簡單性。

文件事件處理器的結構包含4個部分:多個Socket、IO多路復用程序、文件事件分派器以及事件處理器(命令請求處理器、命令回復處理器、連接應答處理器等)。

多個 Socket 可能并發的產生不同的操作,每個操作對應不同的文件事件,但是IO多路復用程序會監聽多個 Socket,會將 Socket 放入一個隊列中排隊,每次從隊列中取出一個 Socket 給事件分派器,事件分派器把 Socket 給對應的事件處理器。

然后一個 Socket 的事件處理完之后,IO多路復用程序才會將隊列中的下一個 Socket 給事件分派器。文件事件分派器會根據每個 Socket 當前產生的事件,來選擇對應的事件處理器來處理。

2)文件事件

當 Socket 變得可讀時(比如客戶端對redis執行write操作,或者close操作),或者有新的可以應答的 Sccket 出現時(客戶端對redis執行connect操作),Socket就會產生一個AE_READABLE事件。

當 Socket 變得可寫的時候(客戶端對redis執行read操作),Socket 會產生一個AE_WRITABLE事件。

IO 多路復用程序可以同時監聽 AE_REABLE 和 AE_WRITABLE 兩種事件,如果一個Socket同時產生了這兩種事件,那么文件事件分派器優先處理 AE_READABLE 事件,然后才是 AE_WRITABLE 事件。

3)文件事件處理器

如果是客戶端要連接redis,那么會為 Socket 關聯連接應答處理器。
如果是客戶端要寫數據到redis,那么會為 Socket 關聯命令請求處理器。
如果是客戶端要從redis讀數據,那么會為 Socket 關聯命令回復處理器。

4)客戶端與redis通信的一次流程

在 Redis 啟動初始化的時候,Redis 會將連接應答處理器跟 AE_READABLE 事件關聯起來,接著如果一個客戶端跟Redis發起連接,此時會產生一個 AE_READABLE 事件,然后由連接應答處理器來處理跟客戶端建立連接,創建客戶端對應的 Socket,同時將這個 Socket 的 AE_READABLE 事件跟命令請求處理器關聯起來。

當客戶端向Redis發起請求的時候(不管是讀請求還是寫請求,都一樣),首先就會在 Socket 產生一個 AE_READABLE 事件,然后由對應的命令請求處理器來處理。這個命令請求處理器就會從Socket中讀取請求相關數據,然后進行執行和處理。

接著Redis這邊準備好了給客戶端的響應數據之后,就會將Socket的AE_WRITABLE事件跟命令回復處理器關聯起來,當客戶端這邊準備好讀取響應數據時,就會在 Socket 上產生一個 AE_WRITABLE 事件,會由對應的命令回復處理器來處理,就是將準備好的響應數據寫入 Socket,供客戶端來讀取。

命令回復處理器寫完之后,就會刪除這個 Socket 的 AE_WRITABLE 事件和命令回復處理器的關聯關系。 

(3)為啥Redis單線程模型也能效率這么高?

1)純內存操作

Redis 將所有數據放在內存中,內存的響應時長大約為 100 納秒,這是 redis 的   QPS 過萬的重要基礎。

2)核心是基于非阻塞的IO多路復用機制

有了非阻塞 IO 意味著線程在讀寫 IO 時可以不必再阻塞了,讀寫可以瞬間完成然后線程可以繼續干別的事了。

redis 需要處理多個 IO 請求,同時把每個請求的結果返回給客戶端。由于 redis 是單線程模型,同一時間只能處理一個 IO 事件,于是 redis 需要在合適的時間暫停對某個 IO 事件的處理,轉而去處理另一個 IO 事件,這就需要用到IO多路復用技術了, 就好比一個管理者,能夠管理個socket的IO事件,當選擇了哪個socket,就處理哪個socket上的 IO 事件,其他 IO 事件就暫停處理了。

3)單線程反而避免了多線程的頻繁上下文切換帶來的性能問題。(百度多線程上下文切換)

  • 第一,單線程可以簡化數據結構和算法的實現。并發數據結構實現不但困難而且開發測試比較麻

  • 第二,單線程避免了線程切換和競態產生的消耗,對于服務端開發來說,鎖和線程切換通常是性能殺手。

  • 單線程的問題:對于每個命令的執行時間是有要求的。如果某個命令執行過長,會造成其他命令的阻塞,所以 redis 適用于那些需要快速執行的場景。

“Redis的線程模型是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

吉隆县| 建宁县| 石屏县| 新兴县| 紫金县| 余干县| 大宁县| 资阳市| 吉水县| 麦盖提县| 大渡口区| 永和县| 全椒县| 昭通市| 交口县| 东宁县| 当阳市| 高邮市| 万宁市| 洞头县| 新绛县| 海阳市| 长丰县| 开原市| 芦山县| 淮南市| 龙胜| 平山县| 澜沧| 开平市| 铁力市| 赤峰市| 海南省| 霞浦县| 保山市| 峡江县| 迭部县| 肇东市| 镇雄县| 山东| 西峡县|