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