Redis的單線程與多線程

Redis的核心處理邏輯一直都是單線程?有一些分支模塊是多線程(某些異步流程從4.0開始用的多線程,例如UNLINK、FLUSHALL ASYNC、FLUSHDB ASYNC等非阻塞的刪除操作。網絡I/O解包從6.0開始用的是多線程;)

為什么是單線程

多線程多好啊可以利用多核優勢

官方給的解釋

意思就是Redis的定位,是內存k-v存儲, 是做短平快的熱點數據處理,一般來說執行會很快,執行本身不是瓶頸,而瓶頸通常在網絡I/O,處理邏輯多線程并不會有太大收益。
同時,Redis本身 秉持簡潔高效的理念,代碼的簡單性、可維護性 是Redis以來一直以來的追求,引入多線程帶來的復雜性遠比想象的要大,而且多線程本身也會引入額外成本,細說

1.多線程的引入的復雜度很大


1.首先,多線程引入之后,Redis原來的順序執行特性就不復存在,為了支持事務的原子性、隔離性,Redis就不得不引入一些很復雜的實現; .
2.Redis的數據結構極其高效,在單線程模式下做了很多特性的優化,如果引入多線程,那么所有
底層數據結構都要改造為線程安全,這會是極其復雜的工作;
3.而且,多線程模式也使得程序調試更加復雜和麻煩,會帶來額外的開發成本及運營成本,也更容易犯錯(回想一下MYSQL并發....)

2.多線程帶來額外的成本

1.上下文切換成本,多線程調度需要切換線程上下文,這個操作先存儲當前線程的本地數據、程序指針等,然后載入另一個線程數據,這種內核操作的成本不可忽視。
2.同步機制的開銷,-些公共資源,在單線程模式下直接訪問就行了,多線程需要通過加鎖等方式去進行同步,這也是不可忽視的CPU開銷;
3.一個線程本身也占據內存大小,對Redis這種內存數據庫而言,內存非常珍貴,多線程本身帶來的內存使用的成本也需要謹慎決策。
?

單線程為什么這么快

第一,Redis的大部分操作在內存上完成,內存操作本身就特別快;
第二,Redis追求極致,選擇了很多高效的數據結構,并做了非常多的優化,比如ziplist, hash,跳表,有時候一種對象底層有幾種實現以應對不同場景。
第三,Redis 采用了多路復用機制,使其在網絡I0操作中能并發處理大量的客戶端請求,實現高吞吐量。
第一第二點挺好理解的?第三點怎么說

什么叫I/0多路復用,簡單理解來說,就是有I/0操作觸發的時候,就會產生通知,收到通知,再去處理通知對應的事件,針對I/0多路復用,Redis做了一層包裝,叫Reactor模型。
本質就是監聽各種事件,當事件發生時,將事件分發給不同的處理器。

這樣就不會阻塞在某一個操作上,充分發揮性能,可以說I/O多路復用讓Redis單線程也有了較大的并發度,注意這里是并發,而不是并行,在這種模式下,Redis單 核的性能可以說是被充分的利用了。
?

但是呢

現在業務量實在是太大了

前面也有說過,Redis選擇 單線程的核心原因是Redis是都是內存操作,CPU處理都非常快,瓶頸更容易出現在I/O而不是CPU,所以選擇了單線程模型。

隨著時代的發展,很多業務的請求量都達到了一個曾經難以想象的高度,I/O操作確實成為了瓶頸,而之前Redis處理流程中讀取請求、發送回包都屬于I/O操作,所以Redis引入了多線程,這里的多線程也不是說將整個處理邏輯都多線程化,如果這么做,需要對所有數據結構進行線程安全重構,這是巨大的成本,并且,也不見得能有多大提升,甚至可能因為損耗而降低,畢竟瓶頸大多時候都不在處理,瓶頸實際一般都在 于網絡I/O。
因為上述情況,Redis選擇了引入多線程來處理網絡I/O,仍然使用單線程框架來執行Redis命令,這樣既保持了Redis核心的單線程處理架構,完全兼容以前的實現,又引入了多線程解決提升網絡I/O的性能。
?

關于多線程不需要了解太多

首先?多線程是6.0之后引入的?為了解決日益變多的數據量?默認是關閉了?可以在.conf里面修改 多線程負責的是處理網絡I/O?具體來說

讀取并解析指令以及回包。

單線程模式下是一個線程完成讀取、解析、執行、將回包放入客戶端緩沖區;
但在多線程模式下,會將不同的client放 入clients_ pending_ read任務隊列中, 后續會通Round-Robin輪詢負載均衡策略把這些client分給其他IO線程和主線程進行讀取和解析;在回包的時候,也是利用Round-Robin輪詢負 載均衡策略把等待回包隊列中的任務連續均勻地分配給IO線程各自的
本地FIFO任務隊列和主線程自己,主線程輪詢等待所有IO線程完成回包任務

?

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

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

相關文章

UI自動化環境的搭建(python+pycharm+selenium+chrome)

最近在做一些UI自動化的項目,為此從環境搭建來從0到1,希望能夠幫助到你,同時也是自我的梳理。將按照如下進行開展: 1、python的下載、安裝,python環境變量的配置。 2、pycharm開發工具的下載安裝。 3、selenium的安裝。…

Leetcode34 在排序數組中查找元素的第一個和最后一個位置

給你一個按照非遞減順序排列的整數數組 nums,和一個目標值 target。請你找出給定目標值在數組中的開始位置和結束位置。 如果數組中不存在目標值 target,返回 [-1, -1]。 你必須設計并實現時間復雜度為 O(log n) 的算法解決此問題。 代碼: c…

如何使用 Go 獲取 URL 的參數,以及使用時的問題

Go 獲取 URL 參數也很容易,但是由于 Go 有嚴格的數據類型和錯誤管理,所以在使用時會些微有些復雜。所以本文不僅會講如何獲取 URL 的參數,也會講在使用時的一些問題。 首先假設 URL 是https://www.example.com/?keywordabc&id12。 其他…

java中函數式接口、Stream流、方法引用、junit單元測試、反射、注解

函數式接口: 在java中有且僅有一個抽象方法的接口稱為函數式接口,但是可以包含其它的默認的或靜態的方法。 格式: 修飾符 interface 接口名稱 {public abstract 返回值類型 方法名稱(可選參數);// 其他非抽象方法 }函數式接口:…

服務器安全維護注意事項有哪些?

服務器的安全關系著公司整個網絡以及所有數據的安全,我們該如何做好服務器后續的安全維護呢?河南億恩科技股份有限公司,專注服務器托管23年,不僅是國內專業的互聯網基礎應用服務提供商之一,還是國家工信部認定的綜合電信服務運營…

OpenJDK Maven 編譯出錯: package jdk.nashorn.internal.runtime.logging does not exist

前言 OpenJDK 1.8.0Maven 3.8.5TencentOS Server 3.1 錯誤信息 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project tour-common: Compilation failure: Compilation failure: [ERROR] /opt/tour-c…

JavaScript預編譯機制

變量預編譯 任何變量,如果未經聲明就賦值,此變量是屬于 window 的屬性,而且不會做變量提升,無論在哪個作用域內賦值。比如說直接寫 console.log(a)肯定會報錯,提示找不到 a。但如果直接寫 a 100就不會報錯&#xff0…

【Linux命令行與Shell腳本編程】第十九章 正則表達式

Linux命令行與Shell腳本編程 第十九章 正則表達式 文章目錄 Linux命令行與Shell腳本編程 第十九章 正則表達式九.正則表達式9.1.正則表達式基礎9.1.1.正則表達式的類型9.2.定義BRE模式9.2.1.普通文本9.2.2.特殊字符 9.2.3.錨點字符錨定行首^錨定行尾$組合錨點 9.2.4.點號字符\.…

funbox3靶場滲透筆記

funbox3靶場滲透筆記 靶機地址 https://download.vulnhub.com/funbox/Funbox3.ova 信息收集 fscan找主機ip192.168.177.199 .\fscan64.exe -h 192.168.177.0/24___ _/ _ \ ___ ___ _ __ __ _ ___| | __/ /_\/____/ __|/ __| __/ _ |/ …

SpringBoot復習(39)Servlet容器的自動配置原理

Servlet容器自動配置類為ServletWebServerFactoryAutoConfiguration 可以看到通過Import注解導入了三個配置類: 通過這個這三個配置類可以看出,它們都使用了ConditionalOnClass注解,當類路徑存在tomcat相關的類時,會配置一個T…

【數據結構?堆】序列和的前n小元素

題目描述 問題&#xff1a;序列和的前n小元素   給出兩個長度為n的有序表A和B, 在A和B中各任取一個, 可以得到 n^2 個和. 求這些和最小的n個。 輸入輸出格式 輸入格式&#xff1a; 輸入數據共三行。   第一行&#xff0c;一個整數值n &#xff08; n < 10^4 &#xff…

Linux系列:從0到1用Docker部署springboot項目

目錄 1.前提條件 2.編寫DockerFile鏡像文件 3.打包SpringBoot項目 4.通過軟件Xftp進行傳輸&#xff08;*&#xff09; 1.點擊“文件-新建”?編輯 5.操作遠程主機 1.docker構建 2.容器運行 6.容器的關閉和刪除 1.前提條件 Linux、docker、xftp的安裝、一臺可以訪問的遠…

教雅川學纏論07-中樞實戰眾泰汽車000980

本文實戰眾泰汽車 下面是2023年11月14-2023年8月8眾泰汽車日K圖 先畫日K 接下來處理包含&#xff0c;就變成下面這個樣子 下面在套上纏論的理論&#xff0c;未來股價的走勢應該是紅色橢圓形虛線里面的樣子 好了&#xff0c;文章就到這里&#xff0c;如果眾泰最終不是這個走勢…

linux 目錄操作命令

目錄操作命令 文件列表 ls命令文件列表 ls [選項] [參數]-------------------------------l 詳細信息-L 緊接著符號性連接&#xff0c;列出它們指向的文件-a 所有文件&#xff0c;包含隱藏文件(以點號起始的文件)-A 與-a相同&#xff0c;但是不會列出來. 和 ..-c 根據創建時間排…

IDEA部署配置Maven項目教程,IDEA配置Tomcat(2019.3.3)

一、前言 當涉及到軟件開發和項目管理時&#xff0c;使用一個可靠的構建工具是非常重要的。Maven是一個廣泛使用的構建工具&#xff0c;它為Java項目提供了一種簡化的構建過程和依賴管理。 在本文中&#xff0c;我們將探討如何部署Maven并開始使用它來構建您的項目。我們將介紹…

Java基礎篇--淺拷貝和深拷貝

概念 淺拷貝&#xff08;Shallow Copy&#xff09;和深拷貝&#xff08;Deep Copy&#xff09;是在對象復制過程中常用的概念。 淺拷貝是指創建一個新對象&#xff0c;并將原始對象的非靜態字段的值拷貝到新對象中。如果字段是基本數據類型&#xff0c;直接復制其值&#xf…

開源數據庫Mysql_DBA運維實戰 (修改root密碼)

MySQL——修改root密碼的4種方法 本文以windows為例為大家詳細介紹下MySQL修改root密碼的4種方法&#xff0c;大家可以可以根據的自己的情況自由選擇&#xff0c;希望對大家有所幫助 方法1&#xff1a; 用SET PASSWORD命令 首先登錄MySQL。 格式&#xff1a;mysql> set pass…

Android APK體積優化(瘦身)

1、基礎知識&#xff1a; 1.1 apk結構 lib &#xff1a;存放so文件&#xff0c;對應不同的cpu架構 res &#xff1a;資源文件&#xff0c;layout、drawable等&#xff0c;經過aapt編譯 assets &#xff1a;資源文件&#xff0c;不經過aapt編譯 classes.dex &#xff1a;dx編譯…

爬蟲:使用Selenium模擬人工操作及獲取網頁內容

專欄介紹 結合自身經驗和內部資料總結的Python教程,每天3-5章,最短1個月就能全方位的完成Python的學習并進行實戰開發,學完了定能成為大佬!加油吧!卷起來! 全部文章請訪問專欄:《Python全棧教程(0基礎)》 再推薦一下最近熱更的:《大廠測試高頻面試題詳解》 該專欄對…

graphab 教程 ——生成廊道

Graphab軟件包括圖譜創建、基于圖譜的連通性計算、分析與推廣、制圖四個模塊。Graphab軟件的圖譜創建基于柵格數據進行,包括斑塊識別和連接建立兩個步驟。Graphab 軟件可識別的柵格數據格式包括TIFF、ASCI和RST,柵格像元記錄數值用于識別斑塊類型,識別規則可以選擇四鄰域或八鄰…