阿裡一面:Redis是單線程,這樣回答,面試官口水直流....

来源:https://www.cnblogs.com/tutou123cn/p/18266088
-Advertisement-
Play Games

Redis 的單線程與多線程之爭 為什麼 Redis 使用單線程 Redis 單線程為什麼還那麼快 Redis 6.0 引入多線程的原因 Redis 的網路模型 結語 ...


Redis 是單線程的嗎?帶你全面瞭解 Redis

內容目錄

Redis 的單線程與多線程之爭為什麼 Redis 使用單線程Redis 單線程為什麼還那麼快Redis 6.0 引入多線程的原因Redis 的網路模型結語

哈嘍,大家好,我是小宋科技。今天在刷博客的時候,看到一個挺有意思的面試題:“Redis 是單線程的嗎?”平時我們常聽說 Redis 是單線程的,但實際上,Redis 從 4.0 開始就部分引入了多線程機制。為什麼我們還說 Redis 是單線程的呢?

Redis 的單線程與多線程之爭

Redis 中存在非同步操作,例如 bgsave 命令,它允許在後臺非同步將當前數據持久化到磁碟。既然有非同步操作,自然涉及多線程,那為什麼還說 Redis 是單線程的呢?
實際上,平時所說的 Redis 是單線程的,主要是指 Redis 對外提供鍵值對存儲服務的核心功能,即網路請求和數據操作是由一個線程完成的。而其他例如持久化存儲、集群支撐等模塊可以由多線程完成。在 Redis 6.0 版本中,網路請求處理部分迎來了一次重大更新,引入了多線程模型。這意味著 Redis 在接收網路請求時,可以利用多個線程並行處理,從而大大提高併發性能。

為什麼 Redis 使用單線程

很多人認為“單線程”意味著“低效”。然而,Redis 採用單線程模型主要有三個原因:

  1. CPU 不是性能瓶頸:Redis 的操作基本都是基於記憶體的,因此 CPU 並不是瓶頸所在。
  2. 磁碟 IO 不是瓶頸:Redis 操作主要在記憶體中進行,很少涉及磁碟 IO。
  3. 網路 IO 是主要挑戰:早期設計者認為通過 IO 多路復用技術足以應對大部分場景。

多線程的引入雖然可以提高 IO 和 CPU 的利用率,但也會帶來併發問題和設計複雜性。因此,Redis 最終選擇了簡單的單線程模型。

Redis 單線程為什麼還那麼快

Redis 單線程模型能夠避免不同線程之間的資源競爭,同時減少線程切換的開銷。其高效性還體現在以下幾個方面:

  1. 高效的數據結構:Redis 的數據結構經過精心優化,具有極高的效率。
  2. 基於記憶體操作:所有操作都在記憶體中進行,極少的 IO 時間。
  3. IO 多路復用:通過一個線程監聽多個 IO 事件,加快 IO 利用率。

Redis 6.0 引入多線程的原因

Redis 6.0 引入的多線程主要針對處理網路請求。這是因為,隨著業務場景越來越複雜,有些公司需要更高的 QPS(每秒查詢率)。為了提升 QPS,很多公司會部署 Redis 集群,並儘可能增加 Redis 機器數。但這種做法的資源消耗巨大。
經過分析,限制 Redis 性能的主要瓶頸在網路 IO 的處理上。多路復用的 IO 模型本質上是同步阻塞型 IO 模型,在處理網路請求時調用 select 的過程是阻塞的。為了充分利用 CPU 的多核優勢,Redis 6.0 引入多線程,使得網路請求處理併發進行,大大提升了性能。

Redis 的網路模型

Redis 的網路模型依然基於著名的 Reactor 模式。根據分發器和處理線程的數量,通常可以分為三種模式:

  1. 單分發器單線程:所有操作在同一個線程中完成。
  2. 單分發器多線程:數據的接收和發送由多個線程完成,業務處理在子線程中進行。
  3. 多分發器多線程:多個分發器和多個線程處理請求。

Redis 6.0 採用單分發器多線程模型進行了一定改進:

  1. 接收和發送數據納入子線程:避免高併發時主線程的處理能力成為瓶頸。
  2. 業務在主線程中執行:保持整體結構的一致性,減少修改成本。

結語

Redis 通過引入多線程,充分利用多核優勢,解決了網路 IO 瓶頸問題,大幅提升了併發性能。然而,核心的數據操作仍然由單線程完成,確保了簡單高效的設計。希望本文能幫助大家更好地理解 Redis 的單線程與多線程機制,也歡迎大家在評論區分享自己的見解和問題。
如果覺得本文對你有所幫助,請點贊、轉發、收藏,讓更多人瞭解 Redis 的魅力!


喜歡我的文章記得關註公眾號“小宋編碼”,我們下期再見!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 摘要:本文深入探討了Nuxt 3的組件開發與管理,從基礎概念、安裝配置、目錄結構、組件分類與開發實踐、生命周期與優化,到測試與維護策略。詳細介紹了Nuxt 3的核心特點,如伺服器端渲染(SSR)、靜態站點生成(SSG)以及與Vue生態系統的無縫集成。文章以Nuxt 3為基礎,指導開發者如何高效構建高... ...
  • 問題分析 當我們需要用摺疊面板的時候,往往會考慮element-ui的el-collaspe,然而大多數時候原生預設的樣式並無法拿來就用。我們往往會自定義組件的樣式,或者在預設的基礎上進行修改。最近在Vue項目中進行組件修改的時候,無意間某個文件自動設置成了scoped(應該是插件自動化生成的結構代 ...
  • 前言 眾所周知,在vue2的時候使用一個vue組件要麼全局註冊,要麼局部註冊。但是在setup語法糖中直接將組件import導入無需註冊就可以使用,你知道這是為什麼呢?註:本文中使用的vue版本為3.4.19。 關註公眾號:【前端歐陽】,給自己一個進階vue的機會 看個demo 我們先來看個簡單的d ...
  • CSS 屬性計算過程 你是否瞭解 CSS 的屬性計算過程呢? 有的同學可能會講,CSS屬性我倒是知道,例如: p{ color : red; } 上面的 CSS 代碼中,p 是元素選擇器,color 就是其中的一個 CSS 屬性。 但是要說 CSS 屬性的計算過程,還真的不是很清楚。 沒關係,通過此 ...
  • ‍ 寫在開頭 點贊 + 收藏 學會 前端常用的截圖保存的方法 利用 Blob 對象和 URL.createObjectURL:可以將截圖數據轉換為 Blob 對象,然後使用 URL.createObjectURL 方法生成一個臨時的 URL,將這個 URL 賦值給 <a> 標簽的 ...
  • 主要對面向過程編程與面向對象編程進行對比,介紹了軟體危機的背景,講解了面向對象編程設計思想的由來,對面向對象方法學:OOA-OOD-OOP進行簡單介紹。 ...
  • 表格配置屬性說明文檔 頁面添加引用: import BaseTable from ‘@/components/BaseTable/index.vue 1、grid-edit-width 表格操作欄寬度 例如:grid-edit-width:250 2、gridOtherConfig 屬性 說明 示例 ...
  • Spring Cloud是一個相對比較成熟的微服務框架。雖然,Spring Cloud於2016年才推出1.0的release版本, 時間最短, 但是相比Dubbo等RPC框架, Spring Cloud提供的全套的分散式系統解決方案。 Spring Cloud是一系列框架的有序集合。它利用Spri ...
一周排行
    -Advertisement-
    Play Games
  • 問題 有很多應用程式在驗證JSON數據的時候用到了JSON Schema。 在微服務架構下,有時候各個微服務由於各種歷史原因,它們所生成的數據對JSON Object屬性名的大小寫規則可能並不統一,它們需要消費的JSON數據的屬性名可能需要大小寫無關。 遺憾的是,目前的JSON Schema沒有這方 ...
  • 首先下載centos07鏡像,建議使用阿裡雲推薦的地址: https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/?spm=a2c6h.25603864.0.0.59b5f5ad5Nfr0X 其實這裡就已經出現第一個坑了 centos 07 /u ...
  • 相信很多.NETer看了標題,都會忍不住好奇,點進來看看,並且順便準備要噴作者! 這裡,首先要申明一下,作者本人也非常喜歡Linq,也在各個項目中常用Linq。 我愛Linq,Linq優雅萬歲!!!(PS:順便吐槽一下,隔壁Java從8.0版本推出的Streams API,抄了個四不像,一點都不優雅 ...
  • 在人生的重要時刻,我站在了畢業的門檻上,望著前方的道路,心中涌動著對未來的無限憧憬與些許忐忑。面前,兩條道路蜿蜒伸展:一是繼續在職場中尋求穩定,一是勇敢地走出一條屬於自己的創新之路。儘管面臨年齡和現實的挑戰,我仍舊選擇勇往直前,用技術這把鑰匙,開啟新的人生篇章。 迴首過去,我深知時間寶貴,精力有限。 ...
  • 單元測試 前言 時隔多個月,終於抽空學習了點新知識,那麼這次來記錄一下C#怎麼進行單元測試,單元測試是做什麼的。 我相信大部分剛畢業的都很疑惑單元測試是乾什麼的?在小廠實習了6個月後,我發現每天除了寫CRUD就是寫CRUD,幾乎用不到單元測試。寫完一個功能直接上手去測,當然這隻是我個人感受,僅供參考 ...
  • 一:背景 1. 講故事 最近在分析dump時,發現有程式的卡死和WeakReference有關,在以前只知道怎麼用,但不清楚底層邏輯走向是什麼樣的,藉著這個dump的契機來簡單研究下。 二:弱引用的玩法 1. 一些基礎概念 用過WeakReference的朋友都知道這裡面又可以分為弱短和弱長兩個概念 ...
  • 最近想把ET打表工具的報錯提示直接調用win系統彈窗,好讓策劃明顯的知道表格哪裡填錯數據,彈窗需要調用System.Windows.Forms庫。操作如下: 需要在 .csproj 文件中添加: <UseWindowsForms>true</UseWindowsForms> 須將目標平臺設置為 Wi ...
  • 從C#3開始,拓展方法這一特性就得到了廣泛的應用。 此功能允許你能夠使用實例方法的語法調用某個靜態方法,以下是一個獲取/創建文件的靜態方法: public static async Task<StorageFile> GetOrCreateFileAsync(this StorageFolder f ...
  • 在Windows 11下,使用WinUI2.6以上版本的ListView長這樣: 然而到了Win10上,儘管其他控制項的樣式沒有改變,但ListViewItem變成了預設樣式(初代Fluent) 最重大的問題是,Win10上的HorizontalAlignment未被設置成Stretch,可能造成嚴重 ...
  • 前言 周六在公司加班,幹完活後越顯無聊,想著下載RabbiitMQ做個小項目玩玩。然而這一下就下載了2個小時,真讓人頭痛。 簡單的講一下如何安裝吧,網上教程和踩坑文章還是很多的,我講我感覺有用的文章放在本文末尾。 安裝地址 erlang 下載 - Erlang/OTP https://www.erl ...