阿裡一面: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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...