# 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模型,利用多路复用技术不断的去处理事件。
:-: ![](https://img.kancloud.cn/96/ed/96ed22de6141a5c7c8a6b10deb0be77d_1080x465.png)
从Socket连接的建立,IO数据的读取,命令的解析,IO数据的响应都是由主线程单线程执行的。
其是一个单Reactor模型:
:-: ![](https://img.kancloud.cn/27/69/2769c7b988e0442bee9b4b7408c3cea1_1080x523.png)
但是并不是整个Redis服务器都是单线程的,在Redis4.0之后作者采用了多线程(Lazy Redis)的方式来异步的处理一些阻塞操作,例如删除具有大数据量的key值等。
## Redis6.0的网络模型
在Redis4.0的多线程异步处理任务的引入为Redis6.0多线程的引入奠定基础;Redis6.0引入多线程的主要原因就是Redis的网络IO称为了性能的瓶颈。
针对与Redis的性能可能有如下的两个优化方向:
- 优化网络IO模块,可以采用零拷贝技术或者DPDK技术,或者利用多核的优势,而Reids就是利用了多核的优势而采用了多线程技术。
- 提高机器内存读写的速度,这依赖于硬件设施和摩尔定律。
其多线程网络模型的总体设计思路如下:
:-: ![](https://img.kancloud.cn/20/a6/20a63c72c93caed9926211a5bf4d0394_1080x698.png)
变动之处在于:把读取客户端请求命令和回写响应数据的操作异步化了,交给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