通信协议
- 协议概念: 所谓协议 其实就是 发送和接收 双方约定的数据格式而已;类似于 加密解密; 没有什么神秘; 比如 http协议,双方约定好格式,如何读取url,取参赛,取请求头数据等等;
- redis传输层协议是TCP
- redis应用层协议是其自己实现的一种协议,叫 RESP(redis serialization protocol:redis序列化协议); 这种协议 特点在于 实现简单,快速解析,人类易读,
- 采用这种协议原因是 redis是高性能内存数据库,需要尽可能的减少不必要的计算量及时间,而http是比较复杂的协议;
- RESP协议只用于 redis客户端与服务端之间的交流;
- 协议工作流程(以客户端发送一个命令为例):
- 客户端:原始命令->RESP编码->传输
- 服务端:接收->RESP解码->原始命令
redis高性能的原因
- redis是纯内存的操作,性能瓶颈不在cpu上(因为其不读取硬盘数据),而是网络IO时间 和 内存大小 问题上,而且在硬件上基本不涉及磁盘(除了持久化等情况);
- redis采用单线程模型(指网络事件处理模式(单reactor单线程模型),不是说redis只是单线程程序),因其实现简单,避免多线程频繁上下文切换,及同步机制加锁的开销;
- redis采用 单Reactor单线程 模式的网络事件处理器,内部使用了 I/O多路复用模型,如linux的epoll,使其能同时连接成千上万个客户端连接;
- redis基础数据结构简单高效,如链表,字典,整数集合等,在此基础上实现用户能操作的对象:字符串,列表,hash,集合,有序集合等
redis是单线程系统?
- 常说的redis单线程指其网络事件出来模型 reactor是单线程;
- 由于 redis瓶颈在于网络IO时间较长,所以在redisV6.0引入了多线程去处理客户端IO读写相应,而redis命令的处理还是在主线程 单线出来;
- 针对整个redis系统,则一直有其他线程进行异步任务出来,如 AOF,RDB等数据持久化任务;
单Reactor单线程模型
介绍
- Reactor对象通过epoll监听事件,收到准备就绪的事件后通过dispatch分发,根据事件类型,决定分发到Acceptor(建立客户端连接)或Handler(处理业务的对象)
- 当是 建立连接事件时,则Acceptor对象会通过 accept方法获取连接,然后建立client对象和socket对象,然后产生read事件,将此事件与 命令出来handler关联,表示后续此socket为可读事件,也就是接收客户端的命令操作;
- 当接收到客户端命令的读事件时,Reactor的dispatch(分发)将读事件分发给对应的hanlder,handler读取命令,执行完后,生成一个 包含数据的写事件扔给Reacotr,让其再次分发给写事件的handler; 然后此hanler将数据写入socket发送给客户端;
优点
- 单线程操作,方便管理,没有锁的困扰;
缺点
- 所有业务操作都在一个线程中执行,如果一个连接的操作耗时较长会导致 所有连接响应延迟;但redis没此问题,因为其是内存操作,瓶颈不在cpu;
- 随着高并发的增长,网络IO操作耗时越来越明显(read操作,从内核读数据到应用程序,write操作,应用程序中的数据写到内核),而这些操作 都在主线程中执行,由于这些网络IO操作 浪费了CPU资源,所以网络IO就是瓶颈;
缺点解决方案
- 将 网络IO操作从主线程中 提取到 只负责此功能的IO线程中; 这样 主线程只负责执行命令,充分利用cpu; IO线程只负责 从socket读取写入数据;
redis 单reactor单线程模式+多线程网络IO
示意图
工作方式
- 网络IO线程 专门负责从socket读取或写入数据,主线程仍然负责执行命令;