為什么說 Redis 是單線程的?——Java全棧知識(25)

為什么說 Redis 是單線程的?

我們常說的 Redis 是單線程的,但是我前面在講持久化機制的時候又說 RDB 的持久化是通過主進程 fork 出一個子進程來實現 RDB 持久化。那么 Redis 到底是多線程還是單線程的呢?
Redis 的網絡 IO 和鍵值的讀寫是單線程完成的。
但是在 Redis4.0 之后,Redis 引入了多線程模型,但是 IO 部分還是由單線程完成,而其他的如持久化存儲模塊、集群支撐模塊等是多線程的。(Redis 6.0 之后將網絡 IO 改為了多線程)

[!info]
前面我們講到的 RDB 持久化,以及 Redis 集群支撐都是基于多線程完成的

1、多線程的好處

多線程的好處在于能夠更大程度的利用 CPU 資源以及 IO 資源。
首先 Redis 是否需要提升 CPU 利用?
我們都知道 Redis 是基于內存的數據庫,CPU 的資源不是 Redis 的性能瓶頸
所以,通過多線程技術來提升 Redis 的 CPU 利用率這一點是完全沒必要的。

那么,使用多線程技術來提升 Redis 的 l/O 利用率呢?是不是有必要呢?
Redis 確實是一個 I/O 操作密集的框架,他的數據操作過程中,會有大量的網絡 I/O 和磁盤 I/O 的發生。要想提升 Redis 的性能,是一定要提升 Redis 的 I/O 利用率的,這一點毋膏置疑。
但是,提升 I/O 利用率,并不是只有采用多線程技術這一條路可以走。
image.png|700
Redis 基于 I/O 多路復用來提高 IO 利用率。

2、多線程的壞處

我們都知道 Java 針對并發安全做出了很多的方案。如內存模型、鎖、CAS 等,這些者都是 Java 中提供的一些在多線程情況下保證線程安全的技術。
和 Java 類似,所有支持多線程的編程語言或者框架,都不得不面對的一個問題,就是如何解決多線程編程模式帶來的共享資源的并發控制問題。
雖然,采用多線程可以幫助我們提升 CPU 和I/O 的利用率,但是多線程帶來的并發問題也給這些語言和框架帶來了更多的復雜性。而且,多線程模型中,多個線程的互相切換也會帶來一定的性能開銷。
所以,在提升I/O 利用率這個方法上,Rdis 并沒有采用多線程技術,而是選擇了多路復用 I/O 技術。

3、Redis 是否需要多線程?

6.0 之前沒使用多線程原因:

  1. Redis 是基于內存的, 執行速度非常快,CPU 資源不是瓶頸。
  2. 采用多線程,避免不必要的上下文切換,避免線程不安全的問題。
  3. 采用了 I/O 多路復用,非阻塞式 IO。
    引入多線程的原因:
  4. 隨著業務的越來越復雜,Redis 的網絡 IO 還是成為了最大的瓶頸。
  5. Redis 6.0 的多線程,只是在處理網絡 IO 處使用,在執行命令依然是單線程

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

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

相關文章

力扣:1306. 跳躍游戲 III

1306. 跳躍游戲 III 這里有一個非負整數數組 arr,你最開始位于該數組的起始下標 start 處。當你位于下標 i 處時,你可以跳到 i arr[i] 或者 i - arr[i]。 請你判斷自己是否能夠跳到對應元素值為 0 的 任一 下標處。 注意,不管是什么情況下…

數據庫|基于T-SQL創建數據庫

哈嘍,你好啊,我是雷工! SQL Server用于操作數據庫的編程語言為Transaction-SQL,簡稱T-SQL。 本節學習基于T-SQL創建數據庫。以下為學習筆記。 01 打開新建查詢 首先連接上數據庫,點擊【新建查詢】打開新建查詢窗口, …

appium-driver方法待整理。。

app C:\Users\v-hongweishi\AppData\Local\Programs\Xmind\Xmind.exe deviceName DESKTOP-7NJ1ENB platformName Windows 應用程序ID(AppId)是應用程序用戶模型 ID (AppUserModelID),簡稱 AUMID Outlook …

Leetcode 113:路徑總和II

給你二叉樹的根節點 root 和一個整數目標和 targetSum &#xff0c;找出所有 從根節點到葉子節點 路徑總和等于給定目標和的路徑。 葉子節點 是指沒有子節點的節點。 public static List<List<Integer>> pathSum(TreeNode root, int targetSum) {List<List&l…

C++—結構體

結構體&#xff08;struct&#xff09;&#xff0c;是一種用戶自定義復合數據類型&#xff0c;可以包含不同類型的不同成員。 結構體的聲明定義和使用的基本語法&#xff1a; // 聲明結構體struct 結構體類型 { 成員1類型 成員1名稱; ...成員N類型 成員N名稱; };除聲明…

【計算機視覺(2)】

基于Python的OpenCV基礎入門——視頻的處理 視頻OpenCV視頻處理操作&#xff1a;創建視頻對象判斷視頻是否成功初始化讀取視頻幀獲取視頻特征設置視頻參數聲明編碼器保存視頻釋放視頻對象 視頻處理基本操作的代碼實現&#xff1a; 視頻 視頻是由一系列連續的圖像幀組成的。每一…

Spring—IoC

目錄 1. IoC的提出 2. Spring容器 2.1. Spring容器實現原理 2.2. Spring組件 2.2.1 XML標簽方式 2.2.2. 類注解方式 2.2.3. 方法注解方式 2.3. Spring容器分類 2.3.1. BeanFactory容器 2.3.2. ApplicationContext容器 2.3.3. WebApplicationContext容器 3. Spring中…

Srping 歷史

一、History of Spring and the Spring Framework Spring came into being in 2003 as a response to the complexity of the early J2EE specifications. While some consider Java EE and its modern-day successor Jakarta EE to be in competition with Spring, they are …

nginx 配置stream模塊代理并開啟日志配置

前言 nginx 1.20.1 nginx從1.9.0開始,新增加了一個stream模塊 確保nginx 安裝時開啟stream模塊 ./configure \ …… \ --with-stream \ --with-stream_ssl_module \ 修改nginx.conf #增加stream配置&#xff0c;開啟stream模塊 stream {log_format basic $remote_addr [$…

stm32 作為從機, fpga 作為主機,進行 spi 通信

stm32 作為從機, fpga 作為主機,進行 spi 通信 STM32和FPGA之間的SPI通信是直連形式。使用FPGA讀取傳感器的值,傳輸到STM32中進行計算。 STM32是將SPI接受過來的數據存儲到DMA中。 #include "SPI_DMA.h" #include <stm32f10x.h> uint8_t spi_buf[4];//FP…

idea啟動報錯:java.lang.NoClassDefFoundError: org/mybatis/logging/LoggerFactory

文章目錄 一、問題二、解決方法 一、問題 問題描述&#xff1a;idea整合Mybatis-plus的時候&#xff0c;啟動報錯&#xff1a;java.lang.NoClassDefFoundError: org/mybatis/logging/LoggerFactory 二、解決方法 可能原因&#xff1a;仔細檢查了一下&#xff0c;發現 mybati…

《王者榮耀》4月狂攬2.34億美元 單日流水1億美元 全球銷量第二

易采游戲網5月24日消息&#xff0c;在剛剛過去的四月&#xff0c;全球手游市場迎來了一場收益的盛宴&#xff0c;其中《王者榮耀》以其驚人的吸金能力&#xff0c;以2.34億美元的月收入在全球手游排行榜上位列第二。4月5日&#xff0c;這款由騰訊游戲開發的多人在線戰斗競技游戲…

C++相關概念和易錯語法(14)(初始化注意事項、vector、編譯器向上查找規則)

1.當我們在代碼中想要終止運行的話&#xff0c;我們可以采用Ctrl C或Ctrl Z&#xff0c;其中^C代表殺進程&#xff0c;^Z設置結束2.編碼表&#xff1a;我們目前比較熟悉的是ASCII碼編碼方式&#xff0c;但是我們發現平時使用的漢字無法通過ASCII編碼&#xff0c;除此之外&…

前端canvas項目實戰——在線圖文編輯器:序

目錄 前言一、 博主是誰&#xff1f;二、 關于本專欄1. 本專欄涉及的技術棧2. 專欄適合誰來學習&#xff1f;3. 你可以從專欄學到什么&#xff1f;4. 系列文章索引 三、 付費信息后記 前言 很高興&#xff0c;今天我又為自己設定了一個目標&#xff1a;帶領大家從入門HTML5中的…

自動化測試用例結構

標準的用例結構&#xff1a; 用力標題前提條件用例步驟預期結果實際結果 測試用例對比&#xff1a;

酷開系統 | 酷開科技把握智慧先機 AI賦能家庭場景

智慧化是當今世界科技發展的前沿領域之一。現在的智慧化&#xff0c;也正在逐步成為我們日常生活的一部分。電視系統也進入了數字化時代&#xff0c;AI的應用正在不斷擴展&#xff0c;其潛力似乎無窮無盡。 酷開科技深耕人工智能技術&#xff0c;在提升語音體驗、強化智能家居…

(1)無線電失控保護(二)

文章目錄 前言 4 參數配置 5 測試 6 使用接收器設置飛行模式(

第二證券:新股申購配號數什么意思?

股配號數量便是我們參與抽簽的數量&#xff0c;投資者申購新股之后&#xff0c;交易所會根據持有的股票市值進行配號。 投資者的市值越大&#xff0c;申購新股的配號越多&#xff0c;其中簽機會越大。主板、創業板、科創板一個申購單位是500股&#xff0c;意味著1萬元的市值有…

Scrapy 從創建到運行

Scrapy是一個強大的Python框架&#xff0c;專門用于構建網絡爬蟲。 步驟1&#xff1a;安裝Scrapy 首先&#xff0c;你需要安裝Scrapy框架來進行后續操作。以下是具體操作步驟&#xff1a; 1、使用pip命令安裝Scrapy&#xff1a; pip install scrapy 步驟2&#xff1a;創建S…

Java 定義類型處理MySQL point類型數據

1.三個類來處理 引入maven依賴 <!-- 引入 jts 庫解析 POINT --><dependency><groupId>com.vividsolutions</groupId><artifactId>jts</artifactId><version>1.13</version></dependency>import javax.validation.constr…