Redis深入理解-Socket連接建立流程以及文件事件處理機制

Redis Server 運行原理圖

在這里插入圖片描述

Redis 服務器中 Socket 網絡建立以及文件事件模型

一個 redis 單機,可以抗幾百上千的并發,這里的并發指的就是同時可以有幾百個 client 對這個 redis server 發起請求,都需要去建立網絡連接,同時間可能會有幾百個 redis client 通過 socket 和我們的 redis server socket 建立網絡連接

如果自己使用 java socket 編程,無論使用 nio、bio,一旦要是說一個 server 和一個 client 完成了一個網絡連接之后,就會多出來一個 socket,socket 是抽象出來通信的模型,通過一個 socket 就可以跟對方的 socket 形成一個連接

那么對于 redis server 而言,內部為了支撐并發訪問的大量的 redis client,redis server 內部就會有幾百個 socket,網絡連接同時在維持著

因此呢,在 bio 模式下,一個 socket 連接就對應了一個線程來監聽請求

在 nio 模式下,可以實現 IO 多路復用,一個線程就可以監聽多個 socket 的網絡事件

在 redis server 中,就是通過 FileEventHandler 進行多路復用

socket 中會產生一些網絡事件,accept(連接應答)、read(有數據可以讀的事件)、write(有數據可以寫的事件)、close(連接被關閉) 在 redis 中這些網絡事件都被抽象為文件事件

基于隊列串行化的文件事件處理機制

針對 server 端的大量的 socket,不太可能每一個 socket 都使用一個線程來監聽,因為線程資源不夠,所以不會采用 bio 模式,因此解決方案就是針對大量的 socket,使用一個線程監聽 n 多個 socket,采用 IO 多路復用模式

當 server 端保持了大量的 redis client 的連接,可能在同一時間,大量的 redis client 并發的給 server 端發送大量的請求,redis server 內部大量的 socket 會突然同一時間產生大量的事件(例如 read 事件,write 事件)

對于這些網絡事件的處理,有兩種解決方案(Redis Server 中就采用了第一種,使用隊列進行串行化處理):

  • 使用 queue 隊列,將接收到事件的 socket 放入 queue 中進行排隊,串行化進行處理
  • 將有事件發生的 socket 分發給不同的線程,來進行并發的處理,開啟大量的多線程,多個線程并發的去處理不同的 socket 里面的事件

client 和 server 端建立連接的流程為:

我們會有一個專門的 socket 去監聽端口,用于監聽來自客戶端的連接請求,這個連接請求經過 IO 多路復用,由 連接應答處理器 進行處理,處理的操作其實也就是服務端和客戶端進行 TCP 三次握手建立連接,建立好連接之后服務端就會創建一個新的 socket,這個 socket 就是接收客戶端對應的事件

那么連接建立之后,客戶端對于服務端的一些讀寫請求就會通過 socket 進行請求,請求到達服務端之后,通過 IO 多路復用將任務分發給不同的事件處理器進行處理,如果是讀寫請求,就將讀寫的響應通過 socket 響應給客戶端

Redis 串行化單線程模型為什么能高并發?

首先 Redis 是通過 串行化 + 單線程 來應對高并發的

Redis 首先是基于內存操作,速度很快,并且當大量請求進入后,都放入隊列中,進行串行化處理,由單個線程直接基于內存進行操作,并且單線程的情況下也不需要加鎖以及線程上下文切換(多線程是很占用 CPU 資源的),核心就在于 Redis 通過單線程基于內存進行操作!

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

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

相關文章

利用 docker 實現JMeter分布式壓測

為什么需要分布式? 在工作中經常需要對一些關鍵接口做高QPS的壓測,JMeter是由Java 語言開發,沒創建一個線程(虛擬用戶),JVM默認會為每個線程分配1M的堆棧內存空間。受限于單臺試壓機的配置很難實現太高的并…

YAML 深入解析:從語法到最佳實踐

什么是YAML YAML(YAML Ain’t Markup Language)是一種人類可讀的數據序列化語言。它的設計目標是使數據在不同編程語言之間交換和共享變得簡單。YAML采用了一種簡潔、直觀的語法,以易于閱讀和編寫的方式表示數據結構。 YAML廣泛應用于配置文…

【OpenCV實現圖像:制作酷炫的動畫效果】

文章目錄 概要生成背景圖添加點動畫添加文本顯示小結 概要 首先,通過導入必要的庫,包括NumPy用于數學運算和Matplotlib庫用于數據可視化。隨后,創建圖形和軸,初始化點的位置,以及編寫初始化函數和更新函數。 初始化函…

C語言歸并排序

以夢為馬,不負韶華 文章目錄 引入:實現原理問題引出:遞歸實現:迭代實現穩定性分析:總結: 引入: 如何將兩個有序數組(假設為升序)合并為一個有序數組? 雙指針…

yolov5/v7修改標簽和檢測框顯示【最全】

《記錄自己在使用yolov5遇到的一些問題》同時也供大家參考,如果對你們有幫助,希望大家可以給個點贊、收藏鼓勵下,非常感謝! 以自帶的一張圖片作為示例,yolov5(6.1版本)的初始檢測框應該是如下圖所示 修改線條粗細、隱藏標簽、隱…

EI論文故障識別程序:DBN深度置信/信念網絡的故障識別Matlab程序,數據由Excel導入,直接運行!

?適用平臺:Matlab2021b版及以上 本程序參考中文EI期刊《基于變分模態分解和改進灰狼算法優化深度置信網絡的自動轉換開關故障識別》中的深度置信網絡(Deep Belief Network,DBN)部分進行故障識別,程序注釋清晰&#x…

Python之學生信息管理系統

目錄 一、基礎界面實現 1、主函數 2、保持循環,獲取用戶需求 二、函數實現模塊功能 1、添加學生信息 2、刪除學生信息 3、修改學生信息 4、查找全部學生信息 5、退出系統 三、整合代碼 1、 完整代碼 2、完整實現過程 實現 打印功能菜單、添加學生信息、刪…

想自學軟件測試?一般人我還是勸你算了吧。。。

📢專注于分享軟件測試干貨內容,歡迎點贊 👍 收藏 ?留言 📝 如有錯誤敬請指正!📢交流討論:歡迎加入我們一起學習!📢資源分享:耗時200小時精選的「軟件測試」資…

<keep-alive>作用及用法

<keep-alive>是Vue.js的內置組件。它用于緩存具有相同組件樹的組件。當組件使用<keep-alive>包裹時&#xff0c;組件不會被銷毀&#xff0c;而是會緩存到內存中&#xff0c;等到下次再次渲染時&#xff0c;直接使用緩存中的組件實例。 <keep-alive>有以下幾…

【Linux】共享內存

文章目錄 一、共享內存的原理詳談共享內存的實現過程二、共享內存的接口函數1.shmget2. shmatshmdtshmctl 進程間使用共享內存通信三、共享內存的特性 關于代碼 一、共享內存的原理 共享內存是由操作系統維護和管理的一塊內存。 共享內存的本質是內核級的緩沖區。 一個進程向…

C語言精華題目錦集1

第一題 test.c文件中包括如下語句&#xff0c;文件中定義的四個變量中&#xff0c;是指針類型的是&#xff08;&#xff09;【多選】 #define INT_PTR int* typedef int* intptr; INT_PRT a,b; int_ptr c,d;A:a ?B:b ?C:c ?D:d #define是宏定義&#xff0c;此時在程序中IN…

SQLite3 數據庫學習(六):Qt 嵌入式 Web 服務器詳解

參考引用 SQLite 權威指南&#xff08;第二版&#xff09;SQLite3 入門 1. Apache 搭建 cgi 環境 1.1 什么是 Apache Apache 是世界使用排名第一的 Web 服務器軟件 它可以運行在幾乎所有廣泛使用的計算機平臺上&#xff0c;由于其跨平臺和安全性被廣泛使用 1.2 具體搭建流程…

一、用戶管理

一、后端數據庫初始化 1.1 因為版本問題&#xff0c;始終報錯&#xff0c;按照報錯信息去查詢解決方案&#xff0c;無法解決 靈機一動&#xff1a; 網址&#xff1a; Spring Boot 3.0 升級 實戰踩坑記錄 - 掘金 (juejin.cn) &#xff11;.&#xff12; 個人配置【運行成功…

c++的三目運算符

C三目運算符增強 C中的三目運算符表達式返回的可以是一個變量&#xff0c;但是C語言中返回的是一個常量。 C語言中&#xff1a; void test05() { int a 10; int b 20; printf("%d\n", a < b ? a : b); //在C語言中三目運算符返回的是表達式的值&am…

Javascript每天一道算法題(十三)——最大子數組和_中等

文章目錄 動態規劃題三個重要步驟&#xff08;了解思路&#xff09;1、問題2、示例3、解決方法&#xff08;1&#xff09;方法1——動態規劃 總結 動態規劃題三個重要步驟&#xff08;了解思路&#xff09; &#xff08;1&#xff09;定義數組元素的含義 用一個數組來保存歷史數…

2020年06月 Scratch(三級)真題解析#中國電子學會#全國青少年軟件編程等級考試

Scratch等級考試(1~4級)全部真題?點這里 一、單選題(共25題,每題2分,共50分) 第1題 執行以下腳本后舞臺上的角色將 ? A:先克隆自身,克隆體出現后被刪除。 B:先克隆自身,克隆體出現后刪除本體。 C:克隆出自身后本體與克隆體同時被刪除。 D:克隆出自身后本體與克…

docker常用命令, 鏡像版本的導入、導出并加載,打包鏡像的命令

文章目錄 docker常用命令&#xff1a;打鏡像包&#xff1a;鏡像版本的導入、導出并加載 docker常用命令&#xff1a; 打鏡像包&#xff1a; ? docker build -t calc:20230630 /home/apps/calc/docker/ 刪除某個鏡像的版本&#xff0c;allen_mysql的5.7版本 docker rmi all…

Redis深入理解-內核請求處理流程、數據傳輸協議

Redis 內核級請求處理流程 Redis Server 其實就是 Linux 服務器中的一個進程 主要還是下圖的流程 應用先和 server 端建立 TCP 連接建立連接之后&#xff0c;server 端就會有一個與該客戶端通信的 socket&#xff0c;客戶端的讀寫請求發送到服務端的 socket那么通過 IO 多路…

分組背包問題學習筆記 AcWing 9. 分組背包問題

原題 有 N&#xfffd; 組物品和一個容量是 V&#xfffd; 的背包。 每組物品有若干個&#xff0c;同一組內的物品最多只能選一個。 每件物品的體積是 vij&#xfffd;&#xfffd;&#xfffd;&#xff0c;價值是 wij&#xfffd;&#xfffd;&#xfffd;&#xff0c;其中 …

PC8233(CC/CV控制)高耐壓輸入5V/3.4A同步降壓電路內建補償帶恒流恒壓輸出

概述 PC8233&#xff08;替代CX8853&#xff09;是一款同步降壓調節器,輸出電流高達3.4A,操作范圍從8V到32V的寬電源電壓。內部補償要求最低數量現成的標準外部組件。PC8233在CC&#xff08;恒定輸出電流&#xff09;模式或CV&#xff08;恒定輸出電壓&#xff09;模式&#x…