说一说Redis的单线程模型
Redis客户端到服务器三过程:发送命令、执行命令、结果返回
执行命令阶段是单线程的,而且命令到达服务器时不会立即执行,而是所有命令进入一个队列,然后逐个被执行。并且多个客户的发送的命令的执行顺序是不确定的,但是可以确定的是不会有两个命令同时被执行,不会产生并发问题。
Redis面向高速执行的数据库,因为Redis是单线程模式,如果每条命令执行需要花费的时间很长,会造成线程阻塞。
Redis内部实现:epoll+自己实现的简单的事件框架,epoll中的读、写、关闭、连接都转化为了事件,然后利用epoll的多路复用特性,不在io上了浪费时间。
一次完整的Redis请求:客户端到服务器的网络连接--Redis读写事件发生--Redis服务器数据处理(单线程)--数据返回
分阶段:
1.客户端到服务器的连接(tcp三次握手)
socket通信,socket服务端监听(listen)多个客户端请求,客户端(a.socket()创建socket对象,b.connect)连接服务器
2.Redis读写事件发生并向服务端发送请求数据
基于tcp连接发起读写事件,假设是set写数据,Redis客户端向建立连接的网络流中发送数据。服务端可以理解为为每一个网络连接创建一个线程同时接收客户端的请求数据。
3.Redis服务端的数据处理
完成数据接收后,依照接收的数据做逻辑处理,然后得到处理后的数据,数据处理可以理解为方法调用,带参调用方法,得到返回值。
4.数据返回
Redis处理完数据之后,立即返回1处理后的数据。
多路:多个网络连接 复用:复用同一个线程
得分点
IO多路复用
参考答案
标准回答
Redis的网络IO和键值对读写是由一个线程来完成的,但Redis的其他功能,例如持久化、异步删除、集群数据同步等操作依赖于其他线程来执行。单线程可以简化数据结构和算法的实现,并且可以避免线程切换和竞争造成的消耗。但要注意如果某个命令执行时间过长,会造成其他命令的阻塞。Redis采用了IO多路复用机制,这带给了Redis并发处理大量客户端请求的能力。
加分回答
Redis单线程实现为什么这么快
延伸阅读
Redis线程模型: