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