Redis是單線程的,如何提高多核CPU的利用率?

一句話回答:

Redis 是單線程處理客戶端命令,但可以通過 多實例部署、I/O 多路復用、后臺線程 + Redis 6 的 I/O Thread 支持,來充分利用多核 CPU。

?

一、Redis 單線程 ≠ 整個 Redis 都是單線程!

Redis 主要的 網絡事件 + 命令執行 是單線程的(主線程),但它其實有多線程參與的場景👇

模塊多線程嗎?說明
? 網絡 I/O 處理(Redis 6 起)? 可啟用 I/O 線程并發讀寫
? 命令執行(SET/GET)? 仍是主線程執行
? 持久化(RDB/AOF寫盤)? 后臺子進程執行
? 異步刪除 / 釋放內存? lazyfree 用線程池處理
? Key 鎖 / 數據結構操作? 主線程,避免加鎖開銷

二、Redis 利用多核的方式有哪些?

1. 啟用 Redis 6+ 的 I/O 多線程

Redis 6 開始支持 I/O 多線程(僅限網絡讀寫,命令仍在主線程):

# redis.conf 中配置io-threads 4io-threads-do-reads yes
  • 原理:接收多個客戶端的請求數據,可并行讀取 socket → 提高吞吐量

  • 適合場景:客戶端很多、網絡收發慢(不是 CPU 密集型命令)

2. 多 Redis 實例部署(橫向擴展)

  • 在一臺服務器上跑多個 Redis 實例(每個實例單線程)

  • 不同實例綁定不同 CPU 核心(taskset

  • 適合多核機器,配合客戶端做 分庫分槽 分流訪問

💡 適合寫多、熱點分散的業務,比如電商、用戶數據分庫等

Redis分片

Redis 分片(Sharding)是把全量數據按一定規則(如 key 的 hash 值)分配到多個 Redis 實例中,每個實例負責一部分 key。

為什么分片能提升多核利用率?
特性說明
每個 Redis 實例是單線程所以單實例最多利用 1 核 CPU ?
多實例部署可以跑在多個 CPU 核心上 ?
客戶端路由

每次只訪問一個實例,減輕單點壓力 ?

3. 使用 Redis Cluster(集群)

  • 多 Redis 實例組成分布式集群,每個節點負責部分 key

  • 多節點 = 多核多機并發,天然并行處理

💡 適合大規模分布式部署,自動分片 + 故障轉移

4. 后臺任務異步多線程(系統內建)

Redis 內部本身就會用多線程處理一些后臺任務,例如:

操作說明
異步刪除大 keyUNLINKFLUSHDB ASYNC 用線程釋放內存
RDB 保存 / AOF rewrite用子進程執行,避免阻塞主線程
key 過期處理一部分定時觸發,一部分惰性刪除(在主線程)

三、Redis 單線程的好處

你可能會問:為啥不多線程執行命令呢?

因為 Redis 的核心數據結構很復雜(如 ziplist、skiplist、hashtable),加鎖會帶來:

  • ? 上下文切換成本

  • ? 鎖競爭

  • ? 不可預測的并發 Bug

👉 單線程讓它保持 高性能 + 數據一致性 + 代碼極簡

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/78260.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/78260.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/78260.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

關于mysql的事務和索引

1. 事務四大特性(ACID) 原子性:事務的操作要么全部成功,要么全部失敗回滾,不可分割。 一致性:事務執行前后,數據必須滿足業務規則(如賬戶總額不變)。 隔離性&#xff1…

【Python】保持Selenium穩定爬取的方法(防檢測策略)

selenium 防檢測策略的方法匯總: 合理設置延遲:請求間添加隨機延遲 (2-10秒) 限制爬取頻率:控制每小時/每天的請求量 輪換用戶代理:準備至少10個不同的User-Agent 使用住宅代理:優先選擇高質量的住宅代理IP 處理驗…

SpringSecurity源碼解讀AbstractAuthenticationProcessingFilter

一、介紹 AbstractAuthenticationProcessingFilter 是 Spring Security 框架里的一個抽象過濾器,它在處理基于表單的認證等認證流程時起著關鍵作用。它繼承自 GenericFilterBean,并實現了 javax.servlet.Filter 接口。此過濾器的主要功能是攔截客戶端發送的認證請求,對請求…

什么是DDD?為什么它正在取代傳統架構?

什么是DDD?為什么它正在取代傳統架構? 1. 傳統開發模式的痛點 在經典的MVC架構中,開發流程往往從數據庫表結構設計開始,業務邏輯散落在Service層,隨著需求迭代容易形成「大泥球」代碼: 實體類變成純粹的…

基于外部中中斷機制,實現以下功能: 1.按鍵1,按下和釋放后,點亮LED 2.按鍵2,按下和釋放后,熄滅LED 3.按鍵3,按下和釋放后,使得LED閃爍

題目: 參照外部中斷的原理和代碼示例,再結合之前已經實現的按鍵切換LED狀態的實驗,用外部中斷改進其實現。 請自行參考文檔《中斷》當中,有關按鍵切換LED狀態的內容, 自行連接電路圖,基于外部中斷機制,實現以下功能&am…

在SQL中,FROM子句中的子查詢必須指定別名,即使后續未引用該別名

FROM子句中的子查詢必須指定別名 示例錯誤示例及原因:總結: 在SQL中, FROM子句中的子查詢必須指定別名, 即使后續未引用該別名 示例 查詢館藏圖書最多的作者姓名及館藏數量 SELECT 作者, COUNT(圖書編號) AS 館藏數量 FROM 圖…

問道數碼獸 懷舊劇情回合手游源碼搭建教程(反查重優化版)

本文將對"問道數碼獸"這一經典卡通風格回合制手游的服務端部署與客戶端調整流程進行詳細拆解,適用于具備基礎 Windows 運維和手游源碼調試經驗的開發者參考使用。教程以實戰為導向,基于原始說明內容重構優化,具備較高的內容查重避重…

Shell腳本-for循環應用案例

在Shell腳本編程中,for循環是一種強大的工具,用于處理重復性任務。無論是批量處理文件、遍歷目錄內容還是簡單的計數任務,for循環都能提供簡潔而有效的解決方案。本文將通過幾個實際的應用案例來展示如何使用for循環解決具體的編程問題。 案…

Chrmo手動同步數據

地址欄輸入 chrome://sync-internals分別點擊這2個按鈕即可觸發手動同步

為什么圓形在GeoJSON中被表示為多邊形(Polygon)而不是圓形類型

GeoJSON規范中沒有"圓形"類型 GeoJSON是一種用于表示地理空間數據的標準格式,它的規范中只定義了以下幾種基本幾何類型: Point (點) LineString (線) Polygon (多邊形) MultiPoint (多點) MultiLineString (多線) MultiPolygon (多多邊形) GeometryCollection (幾…

大數據組件學習之--Kafka 安裝搭建

一、前置環境 在搭建kafka之前,請確認自己的hadoop、zookeeper是否搭建完成且可正常運行 二、下載并上傳安裝包(鏈接為百度網盤) kafka安裝包 tar -zxvf /opt/software/kafka_2.12-2.4.1.tgz -C /opt/module/ 進入解壓后的目錄更改文件名…

PyQt6基礎_pyqtgraph_折線圖with縮放調節

目錄 字符型橫坐標代碼 折線圖代碼 運行 創建新類,繼承pg.PlotWidget,在新類中實現業務內容,重寫pg.PlotWidget中的wheelEvent方法并使用業務數據實現比較理想的縮放狀態。 字符型橫坐標代碼 class StrAxisItem(pg.AxisItem):def __init…

聯邦元學習實現個性化物聯網的框架

隨著數據安全和隱私保護相關法律法規的出臺,需要直接在中央服務器上收集和處理數據的集中式解決方案,對于個性化物聯網而言,訓練各種特定領域場景的人工智能模型已變得不切實際。基于此,中山大學,南洋理工大學&#xf…

audio 核心服務AudioPolicyService 和AudioFlinger啟動流程

目錄 1、audioserver啟動 2、AudioPolicyService啟動 3、AudioFlinger啟動 audio的核心服務有兩個,AudioPolicyService 和AudioFlinger他們到在audioserver一個進程中 1、audioserver啟動 設備開機,系統啟動時將執行 /system/etc/init/audioserver.rc…

反爬蟲機制中的驗證碼識別:類型、技術難點與應對策略

在互聯網數據抓取領域,驗證碼識別是爬蟲過程中的關鍵環節之一。下面對常見驗證碼類型、技術難點及應對策略進行詳細解析,并提供多種場景下的代碼實現示例。 一、驗證碼類型與技術難點 (一)圖形驗證碼 1. 字符驗證碼 特征&#…

vue element使用el-table時,切換tab,table表格列項發生錯位問題

展示問題 問題描述:使用el-table的fixed"right"屬性后,如果切換tab時,回出現最后一列錯誤的問題 官網提供解決方法:doLayout 需要注意的事項:我這里是通過組件使用的table組件,涉及多層組件封裝…

示例:Spring JDBC 聲明式事務(xml配置形式)

聲明式事務是指在不修改源代碼的情況下通過配置applicationContext.xml自動實現事務控制,其本質是AOP環繞通知。它的觸發時機為:1、當目標方法執行成功時自動提交事務,2、當目標方法拋出運行時異常時,自動事務回滾 核心步驟示例&a…

在vmware中ubuntu系統因為安裝了docker查不到ip地址

問題截圖: 根據提供的截圖信息,可以明確看到ens33網卡處于**物理連接斷開(NO-CARRIER)且接口關閉(DOWN)**的狀態,這是導致無法獲取IP地址的直接原因。以下是針對VMware虛擬機的具體解決方案&am…

51c大模型~合集121

我自己的原文哦~ https://blog.51cto.com/whaosoft/13869815 #大模型何以擅長小樣本學習? 這項研究給出詳細分析 近年來,大語言模型(LLM)在人工智能領域取得了突破性進展,成為推動自然語言處理技術發展與通用人…

Babylon.js 材質統一轉換指南:將 AssetContainer 中的所有材質轉換為 PBRMetallicRoughnessMaterial

在現代 3D 開發中,基于物理的渲染(PBR)已成為行業標準。本文將詳細介紹如何在 Babylon.js 中將 AssetContainer 加載的各種材質統一轉換為 PBRMetallicRoughnessMaterial,實現項目材質的標準化。 為什么需要材質轉換? PBRMetallicRoughness…