Redis原理篇-线程IO模型和通信协议待补充
Redis原理篇-线程IO模型和通信协议(待补充)
线程IO模型
Redis是单线程为什么还能那么快?
因为它的所有数据都在内存中,所有的运算都是内存级别的运算。
Redis是单线程,为什么还能处理那么多并发客户端链接?
“多路复用”、非阻塞IO等,原理如下:
非阻塞IO
在套接字对象上提供一个选项Non_Blocking,当这个选项打开时,读写方法不会阻塞,能读多少读多少,能写多少写多少。能读多少取决于内核为套接字分配的读缓冲区的数据字节数,能写多少取决于内核为套接字分配的写缓冲区的空闲字节数。读写方法都会通过返回值告知程序实际读写了多少字节。
事件轮询(多路复用)
有了非阻塞IO,保证了读写不阻塞,但是什么时候下一次读,什么时候下一次写,此时就需要时间轮询来解决了。
最简单的事件轮询API就是select函数,它是操作系统提供给用户程序的API,输入是读写描述符列表read_fds&write_fds,输出是与之对应的可读写事件。同时还提供一个timeout参数,如果没有任何事件到来,那么就多多等待timeout的值的时间,线程处于阻塞状态。
我们通过select系统同时处理多个通道描述符的读写事件,因此我们将这类系统调用称之为多路复用API。现代OS的多路复用API早已不再使用select系统调用,而是使用epoll(Linux)和kqueue(FreeBSD和macosx)。
指令队列
Redis会将每个客户端套接字都关联一个指令队列,客户端的指令通过队列来排队进行处理,先到先服务。
响应队列
Redis同样也是为每个客户端套接字关联一个响应队列。Redis服务器通过响应队列来将指令的返回结果回复给客户端。
通信协议
resp是Redis序列化协议 Re dis S erialization P rotocol的简写。它是一种只管的文本协议,优势在于实现过程异常简单,解析性能极好。(Redis作者认为数据库系统的瓶颈一般不在于网络流量,而在于数据库自身的内部处理上,所以即使Redis使用了浪费流量的文本协议,但是依然可以取得极高的访问性能)。