# Redis 網絡模型
Redis從本質上來講就是一個基于C/S架構的網絡服務器,客戶端與服務端之間通過Socket連接進行通信。Redis之所以能夠那么快很大一部分原因是因為其“單線程”模型。
Redis快的因素可能有如下幾個:
1. C語言編寫。
2. 基于內存。
3. IO多路復用。
4. 單線程模型。
關于Redis為什么選擇單線程的官方解釋:
> CPU成為Redis的瓶頸的情況并不常見,因為Redis通常會受到內存或網絡的限制。例如,使用流水線Redis運行在Linux系統上,平均每秒可以發送100萬個請求,所以如果你的應用程序主要使用O(N)或O(log(N))命令,它幾乎不會占用太多的CPU。
> 也就是cpu不會成為性能瓶頸,內存和網絡才會。
更加具體的原因可能可以歸納為:
1. 避免多線程的上下文切換開銷。
2. 避免同步機制的開銷。
3. 簡單可以維護的。
**Redis線程模型的演變**
1. Redis4.0 引入多線程處理異步任務,例如處理大鍵刪除的操作。
2. Redis6.0 正式在網絡模型中實現I/O多線程。
## Redis1.0 ~ 5.0的網絡模型
Redis1.0 ~ 5.0,核心的網絡模型都是一個單Reactor模型,利用多路復用技術不斷的去處理事件。
:-: 
從Socket連接的建立,IO數據的讀取,命令的解析,IO數據的響應都是由主線程單線程執行的。
其是一個單Reactor模型:
:-: 
但是并不是整個Redis服務器都是單線程的,在Redis4.0之后作者采用了多線程(Lazy Redis)的方式來異步的處理一些阻塞操作,例如刪除具有大數據量的key值等。
## Redis6.0的網絡模型
在Redis4.0的多線程異步處理任務的引入為Redis6.0多線程的引入奠定基礎;Redis6.0引入多線程的主要原因就是Redis的網絡IO稱為了性能的瓶頸。
針對與Redis的性能可能有如下的兩個優化方向:
- 優化網絡IO模塊,可以采用零拷貝技術或者DPDK技術,或者利用多核的優勢,而Reids就是利用了多核的優勢而采用了多線程技術。
- 提高機器內存讀寫的速度,這依賴于硬件設施和摩爾定律。
其多線程網絡模型的總體設計思路如下:
:-: 
變動之處在于:把讀取客戶端請求命令和回寫響應數據的操作異步化了,交給IO線程去完成;IO線程僅僅是讀取和解析客戶端命令而不會真正去執行命令,客戶端命令的執行最終還是再主線程上完成。主線程首先會將任務分配給各個線程,然后主線程和子線程完成命令的解析之后,再由主線程遍歷任務隊列執行命令。
- 第一章 Java基礎
- ThreadLocal
- Java異常體系
- Java集合框架
- List接口及其實現類
- Queue接口及其實現類
- Set接口及其實現類
- Map接口及其實現類
- JDK1.8新特性
- Lambda表達式
- 常用函數式接口
- stream流
- 面試
- 第二章 Java虛擬機
- 第一節、運行時數據區
- 第二節、垃圾回收
- 第三節、類加載機制
- 第四節、類文件與字節碼指令
- 第五節、語法糖
- 第六節、運行期優化
- 面試常見問題
- 第三章 并發編程
- 第一節、Java中的線程
- 第二節、Java中的鎖
- 第三節、線程池
- 第四節、并發工具類
- AQS
- 第四章 網絡編程
- WebSocket協議
- Netty
- Netty入門
- Netty-自定義協議
- 面試題
- IO
- 網絡IO模型
- 第五章 操作系統
- IO
- 文件系統的相關概念
- Java幾種文件讀寫方式性能對比
- Socket
- 內存管理
- 進程、線程、協程
- IO模型的演化過程
- 第六章 計算機網絡
- 第七章 消息隊列
- RabbitMQ
- 第八章 開發框架
- Spring
- Spring事務
- Spring MVC
- Spring Boot
- Mybatis
- Mybatis-Plus
- Shiro
- 第九章 數據庫
- Mysql
- Mysql中的索引
- Mysql中的鎖
- 面試常見問題
- Mysql中的日志
- InnoDB存儲引擎
- 事務
- Redis
- redis的數據類型
- redis數據結構
- Redis主從復制
- 哨兵模式
- 面試題
- Spring Boot整合Lettuce+Redisson實現布隆過濾器
- 集群
- Redis網絡IO模型
- 第十章 設計模式
- 設計模式-七大原則
- 設計模式-單例模式
- 設計模式-備忘錄模式
- 設計模式-原型模式
- 設計模式-責任鏈模式
- 設計模式-過濾模式
- 設計模式-觀察者模式
- 設計模式-工廠方法模式
- 設計模式-抽象工廠模式
- 設計模式-代理模式
- 第十一章 后端開發常用工具、庫
- Docker
- Docker安裝Mysql
- 第十二章 中間件
- ZooKeeper