摘要:這個文件事件處理器是單線程的,所以叫做單線程模型,采用多路復(fù)用機制同時監(jiān)聽多個,根據(jù)上的事件來選擇對應(yīng)的事件處理器處理這個事件。
為什么使用緩存
優(yōu)點:
高性能
高并發(fā)
MySQL天然對高并發(fā)不好,MySQL單機支撐2000qps也開始容易報警,可以使用緩存,讓數(shù)據(jù)查詢從緩存中拿出數(shù)據(jù)
缺點:
緩存的數(shù)據(jù)和數(shù)據(jù)庫的數(shù)據(jù)不一致
緩存雪崩
緩存穿透
緩存并發(fā)競爭
redis 和memcached 的區(qū)別Redis支持服務(wù)端的操作:Redis相比memcache來說,有更多的數(shù)據(jù)結(jié)構(gòu)和并支持更豐富的數(shù)據(jù)操作
memcache沒有原生的集群模式,需要依賴客戶端來實現(xiàn)往集群中分片寫入數(shù)據(jù),但是Redis支持原生的cluster模式,支持集群模式。
Redis 的線程模型Redis是基于reactor模式開發(fā)的網(wǎng)絡(luò)事件處理器,這個處理器叫做文件事件處理器,file event handler。這個文件事件處理器是單線程的,所以Redis叫做單線程模型,采用IO多路復(fù)用機制同時監(jiān)聽多個socket,根據(jù)socket上的事件來選擇對應(yīng)的事件處理器處理這個事件。
如果被監(jiān)聽的scoket準(zhǔn)備好執(zhí)行accept,read,write,close等操作的時候,跟操作對應(yīng)的文件事件就會產(chǎn)生,這個時候文件事件處理器就會調(diào)用和之前相關(guān)的事件處理器處理這些事件。
文件事件處理器是單線程的,但是可以通過IO多路復(fù)用機制監(jiān)聽多個socket,可以實現(xiàn)高性能的網(wǎng)絡(luò)通信,有可以和內(nèi)部的其他線程某塊進(jìn)行對接,保證了Redis內(nèi)部的線程模型的簡單性。
文件事件處理器包括4個部分,即多個socket,IO多路復(fù)用程序,文件事件分派器,事件處理器(命令請求處理器,命令回復(fù)處理器,連接應(yīng)答處理器等)
連接應(yīng)答處理器:將事件如AE—READERABLE事件和命令請求處理器相關(guān)聯(lián)。
命令請求處理器:將請求指令中的數(shù)據(jù)讀出key和value,然后完成key和value的設(shè)置。
命令回復(fù)處理器:對本次的操作輸出一個結(jié)果。
多個socket可能并發(fā)的產(chǎn)生不同的操作,每一個操作對應(yīng)一個不同的文件事件,但是IO多路復(fù)用程序會監(jiān)聽多個socket,會將多個socket放入一個對列中進(jìn)行排隊,每一次從排隊中拿出一個socket給事件分派器,事件分派器把socket給對應(yīng)的事件處理器。
文件事件
當(dāng)socket變得可讀的時候(如客戶端對Redis進(jìn)行write操作的時候,或者close操作的時候),socket就會產(chǎn)生一個AE—READBLE事件,當(dāng)socket變得可寫的時候(客戶端對Redis進(jìn)行read操作),socket會產(chǎn)生一個AE-WRITEABLE事件,IO多路復(fù)用程序可以同時監(jiān)聽AE-WRITE和AE-READE兩種事件,那么文件事件派發(fā)器會優(yōu)先處理AE-READBLE事件,然后處理AE—WRITE事件。
文件事件處理器
如果時客戶端要連接Redis,那么會為socket關(guān)聯(lián)連接應(yīng)答處理器
如果客戶端要寫數(shù)據(jù)到Redis,那么會為scoket關(guān)聯(lián)命令請求處理器
如果客戶端要從Redis讀取數(shù)據(jù),那么會為socket關(guān)聯(lián)命令回復(fù)處理器
客戶端與Redis通信的一次流程
在Redis啟動初始化的時候,Redis會將連接應(yīng)答處理器和AE-READABLE事件關(guān)聯(lián)在一起,接著如果客戶端跟Redis發(fā)起連接,此時會產(chǎn)生一個AE-READBLE事件,然后由連接應(yīng)答處理器來處理和客戶端建立連接,創(chuàng)建客戶端對應(yīng)的socket,同時將這個socket的AE-READBLE事件跟命令請求處理器關(guān)聯(lián)起來。
當(dāng)客戶端向Redis發(fā)起請求的時候,(不管是讀或者是寫的請求),首先就會在socket產(chǎn)生一個AE-READBLE事件,然后由對應(yīng)的命令請求處理器來處理,這個命令請求處理器就會從socket中讀取相關(guān)數(shù)據(jù),然后進(jìn)行執(zhí)行和處理。
接著Redis這邊準(zhǔn)備好了給客戶端的響應(yīng)數(shù)據(jù)之后,就會將socket的AE-WRITEABLE事件跟命令回復(fù)處理器關(guān)聯(lián)起來,當(dāng)客戶端這邊準(zhǔn)備好讀取響應(yīng)數(shù)據(jù)的時候,就會產(chǎn)生一個AE-WRITEABLE事件,會有對應(yīng)的命令回復(fù)處理器來處理,這就是將準(zhǔn)備好的響應(yīng)數(shù)據(jù)寫入socket,供客戶端讀取。
命令回復(fù)處理器寫完之后,就會刪除這個socket的AE-WRITEABLE事件和命令回復(fù)處理器的關(guān)聯(lián)關(guān)系。
為什么Redis是單線程模型也能效率那么高
(1) 純內(nèi)存操作
(2) 核心是非阻塞的IO多路復(fù)用機制
(3) 單線程反而避免了多線程的頻繁上線文切換問題
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/69752.html
摘要:命令實現(xiàn)命令是最常用的命令之一,也是最能反映緩存發(fā)展歷史的操作。命令在客戶端接收之后,經(jīng)由協(xié)議轉(zhuǎn)換傳遞給服務(wù)端執(zhí)行。服務(wù)端執(zhí)行命令前先查詢是否支持該命令,以決定是否執(zhí)行。,是的簡稱,代表的是只存增量的持久化方式。 緣起 最近公司的第一個PHP轉(zhuǎn)GO項目已經(jīng)在生產(chǎn)環(huán)境穩(wěn)定運行數(shù)周,又逢需求小年兒,最近可以得空分享下去年學(xué)GO過程中的練手項目Godis——用Golang實現(xiàn)的Redis. ...
摘要:今天,我們將關(guān)注如何部署容器并測試當(dāng)前實驗性重新調(diào)度功能的當(dāng)前狀態(tài)。注意重新調(diào)度尚處于實驗階段,其中存在。但也確實有部分用戶指出重新調(diào)度機制并未生效,或者是在主機恢復(fù)后出現(xiàn)了兩套容器。 歡迎回來,我們繼續(xù)本系列的第二篇教程。今天我們將主要關(guān)注Redis,希望大家還記得第一部分的主要內(nèi)容——了解如何安裝我們將要使用的環(huán)境。 傳送門: Docker Swarm系列第一部:利用Floc...
閱讀 3152·2021-09-24 10:26
閱讀 3397·2021-09-23 11:54
閱讀 4788·2021-09-22 15:33
閱讀 2300·2021-09-09 09:33
閱讀 1731·2021-09-07 10:10
閱讀 1007·2019-08-30 11:09
閱讀 2905·2019-08-29 17:13
閱讀 1065·2019-08-29 12:35