最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

聊聊Redis的單線程模型

 更新時間:2022年12月19日 15:10:06   作者:nimo10050  
Redis是單線程,主要是指Redis的網(wǎng)絡(luò)IO和讀寫是由一個線程來完成的,但Redis的其他功能,比如持久化、異步刪除、集群數(shù)據(jù)同步等,其實(shí)是由額外的線程執(zhí)行的。這不是本文討論的重點(diǎn),有個印象即可

開篇

本文主要來探討一下 redis 的單線程模型,文章前半部分會先引用某網(wǎng)絡(luò)課程講解的內(nèi)容(圖片+語言描述),后半部分是本人粗略閱讀 redis 源碼后整理出來的一份偽代碼,用來驗(yàn)證文中前半部分的內(nèi)容。

本文對標(biāo)的 redis 版本是 5.x。

正文

redis 涉及的知識點(diǎn)有很多,展開來講能聊到操作系統(tǒng),因此為了方便理解,文中做了很多抽象描述。

文件事件處理器

redis 內(nèi)部使用了一個叫 文件事件處理器( file event handler)的東西,這個文件事件處理器是 單線程 的,所以才有了 redis 是單線程的這一說法。

文件事件處理器的結(jié)構(gòu)如下圖:

它包含 4 個部分:

  • 多個 socketIO
  • 多路復(fù)用程序
  • 文件事件分派器
  • 事件處理器(連接應(yīng)答處理器、命令請求處理器、命令回復(fù)處理器)

文件事件處理器 采用 IO 多路復(fù)用機(jī)制 同時監(jiān)聽多個 socket,根據(jù) socket 上的事件來選擇對應(yīng)的事件處理器進(jìn)行處理。多個 socket 可能會并發(fā)產(chǎn)生不同的操作,每個操作對應(yīng)不同的文件事件,但是 IO 多路復(fù)用程序 會監(jiān)聽多個 socket,會將 socket 產(chǎn)生的事件放入 隊(duì)列 中排隊(duì),事件分派器 每次從隊(duì)列中取出一個事件,把該事件交給對應(yīng)的 事件處理器 進(jìn)行處理。

來看 redis 客戶端與服務(wù)端的一次通信過程:

1. 接收連接請求:

客戶端 socket01 向 redis 的 server socket 請求建立連接,此時 server socket 會產(chǎn)生一個 AE_READABLE 事件,

IO 多路復(fù)用程序監(jiān)聽到 server socket 產(chǎn)生的事件后,將該事件壓入隊(duì)列中。

文件事件分派器從隊(duì)列中獲取該事件,交給連接應(yīng)答處理器。

連接應(yīng)答處理器會創(chuàng)建一個能與客戶端通信的 socket01,并將該 socket01 的 AE_READABLE 事件與 命令請求處理器 關(guān)聯(lián)。

2. 讀取請求內(nèi)容:

假設(shè)此時客戶端發(fā)送了一個 set key value 請求,此時 redis 中的 socket01 會產(chǎn)生 AE_READABLE 事件

IO 多路復(fù)用程序?qū)⑹录喝腙?duì)列

事件分派器從隊(duì)列中獲取到該事件,由于前面 socket01 的 AE_READABLE 事件已經(jīng)與命令請求處理器關(guān)聯(lián),因此事件分派器將事件交給命令請求處理器來處理。

命令請求處理器讀取 socket01 的 key value 并在自己內(nèi)存中完成 key value 的設(shè)置。操作完成后,它會將 socket01 的 AE_WRITABLE 事件與命令回復(fù)處理器關(guān)聯(lián)。

3. 回復(fù)請求:

如果此時客戶端準(zhǔn)備好接收返回結(jié)果了,那么 redis 中的 socket01 會產(chǎn)生一個 AE_WRITABLE 事件,同樣壓入隊(duì)列中,

事件分派器找到相關(guān)聯(lián)的命令回復(fù)處理器

由命令回復(fù)處理器對 socket01 輸入本次操作的一個結(jié)果,比如 ok,之后解除 socket01 的 AE_WRITABLE 事件與命令回復(fù)處理器的關(guān)聯(lián)。

這樣便完成了一次通信。

redis 事件處理偽代碼

// 入口函數(shù)
void aeMain(EventLoop eventLoop) {
    while(true) {
    	// 文件事件處理器
    	aeProcessEvents(eventLoop);  	
    }
}
void aeProcessEvents() {
	// 調(diào)用 epoll_wait 函數(shù),等待I/O事件 (IO 多路復(fù)用程序)
    int numevents = aeApiPoll(timeval);
    for(int i=0; i< numevents; i++) {
    	// 從隊(duì)列中取出對應(yīng)的事件
    	fileEvent = getFromEventQueue(i);
    	// 處理文件事件	(文件事件分派器)
    	processFileEvent(fileEvent);
    	// 處理時間事件。(忽略)
    	processTimeEvent();
    }
}
void processFileEvent() {
	if event == '讀事件' {
		// 讀處理器
		processReadFile();
	} 
	if event == '寫事件' {
		// 寫處理器
		processWriteFile();
	}
}

redis 源碼

篇幅原因這里就不貼 redis 的源代碼,可以用 vscode 等工具打開 redis 安裝目錄下的 src 目錄,通過全局搜索 aeMain 找到入口。

總結(jié)

起初當(dāng)看到別人說 redis 是單線程時,很容易想成 redis 服務(wù)端只開啟了一個線程用于做所有事情,然而實(shí)際上我們所說的 redis 單線程 只是針對 redis 網(wǎng)絡(luò)請求模塊,即文中提到的文件事件處理器。

另外,在第一次看到文中第一張圖時,就感覺像是一個線程(IO多路復(fù)用程序)負(fù)責(zé)往隊(duì)列寫數(shù)據(jù),另一個線程(文件事件分派器)負(fù)責(zé)從隊(duì)列里面讀數(shù)據(jù),那么 redis 的單線程到底體現(xiàn)在哪里呢?

最后通過一頓操作,翻到了相關(guān)源碼,粗略一讀才明白所謂的事件分派器、隊(duì)列等等是這樣的。

到此這篇關(guān)于聊聊Redis的單線程模型的文章就介紹到這了,更多相關(guān)Redis單線程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深入理解JAVA基礎(chǔ)類庫中對象Object類

    深入理解JAVA基礎(chǔ)類庫中對象Object類

    Object類是一個特殊的類,是所有類的父類,如果一個類沒有用extends明確指出繼承于某個類,那么它默認(rèn)繼承Object類。這里主要總結(jié)Object類中的兩個:toString()與equals()方法
    2021-09-09
  • Maven中怎么手動添加jar包到本地倉庫詳解(repository)

    Maven中怎么手動添加jar包到本地倉庫詳解(repository)

    這篇文章主要給大家介紹了關(guān)于Maven中怎么手動添加jar包到本地倉庫的相關(guān)資料,文中通過圖文以及實(shí)例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2023-04-04
  • 如何通過java將doc文件轉(zhuǎn)換為docx文件詳解

    如何通過java將doc文件轉(zhuǎn)換為docx文件詳解

    在數(shù)字化時代文檔處理成為了我們?nèi)粘9ぷ骱蛯W(xué)習(xí)中不可或缺的一部分,其中doc和docx作為兩種常見的文檔格式,各自具有不同的特點(diǎn)和優(yōu)勢,這篇文章主要給大家介紹了關(guān)于如何通過java將doc文件轉(zhuǎn)換為docx文件的相關(guān)資料,需要的朋友可以參考下
    2024-07-07
  • SpringBoot MyBatis簡單快速入門例子

    SpringBoot MyBatis簡單快速入門例子

    MyBatis 是一款優(yōu)秀的持久層框架,它支持自定義 SQL、存儲過程以及高級映射。這篇文章主要介紹了SpringBoot MyBatis快速入門-簡單例子,需要的朋友可以參考下
    2021-07-07
  • Java實(shí)現(xiàn)圖片上傳至服務(wù)器功能(FTP協(xié)議)

    Java實(shí)現(xiàn)圖片上傳至服務(wù)器功能(FTP協(xié)議)

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)圖片上傳至服務(wù)器功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • 基于Mybatis Plus實(shí)現(xiàn)代碼生成器CodeGenerator

    基于Mybatis Plus實(shí)現(xiàn)代碼生成器CodeGenerator

    這篇文章主要介紹了基于Mybatis Plus實(shí)現(xiàn)代碼生成器CodeGenerator,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • Springboot Autowried及Resouce使用對比解析

    Springboot Autowried及Resouce使用對比解析

    這篇文章主要介紹了Springboot Autowried及Resouce使用對比解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06
  • springboot如何獲取接口下所有實(shí)現(xiàn)類

    springboot如何獲取接口下所有實(shí)現(xiàn)類

    這篇文章主要介紹了springboot如何獲取接口下所有實(shí)現(xiàn)類問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • 使用SpringBoot和Redis實(shí)現(xiàn)高效緩存機(jī)制方式

    使用SpringBoot和Redis實(shí)現(xiàn)高效緩存機(jī)制方式

    本文講解如何在SpringBoot中集成Redis,通過注解和自定義策略實(shí)現(xiàn)高效緩存,優(yōu)化包括合理過期、預(yù)熱、避免穿透與擊穿,提升應(yīng)用性能
    2025-08-08
  • SpringBoot 文件或圖片上傳與下載功能的實(shí)現(xiàn)

    SpringBoot 文件或圖片上傳與下載功能的實(shí)現(xiàn)

    這篇文章主要介紹了SpringBoot 文件或圖片上傳與下載功能的實(shí)現(xiàn),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02

最新評論

库尔勒市| 苍梧县| 泾阳县| 巩义市| 陆丰市| 克东县| 金秀| 北宁市| 台山市| 峡江县| 新宾| 揭西县| 宝坻区| 绥江县| 阿巴嘎旗| 霸州市| 临颍县| 新蔡县| 浏阳市| 大邑县| 昆山市| 那坡县| 英超| 苗栗县| 墨江| 兴仁县| 远安县| 永清县| 肥东县| 称多县| 石首市| 南丹县| 玛沁县| 泰宁县| 鄂尔多斯市| 独山县| 德保县| 东安县| 双鸭山市| 阿勒泰市| 靖州|