本文将详细解释Redis中的线程IO模型是什么。边肖觉得挺实用的,就分享给大家参考。希望你看完这篇文章能有所收获。
Redis是一个单线程应用程序。NodeJs和Nginx都是单线程的,都是高性能服务器的例子。
Redis是单线程可以如此快速的原因:
第一,因为它所有的数据都在内存中,所有的操作都是内存级的操作,所以在使用redis的时候要注意时间复杂度为O(n)的指令,因为是单线程的,如果数据量太大,其他指令会被阻塞等待;
其次,redis使用非阻塞IO和多路复用来处理大量的客户端连接。
非阻塞IO
当我们使用套接字读写方法时,默认情况下它是被阻止的。
也就是说,调用read方法传递一个参数n,这意味着在读取最多n个字节后将返回该参数。如果没有字节,线程将继续在read方法中等待,直到有数据到来或连接关闭。当read方法此时返回时,线程可以执行以下逻辑。
通常,写方法不会阻塞。除非内核为套接字分配的写缓冲区已满,否则写方法将阻塞,直到缓冲区中有可用空间。
下图展示了套接字读写的详细过程。
非阻塞IO在使用套接字时提供了一个选项非阻塞。打开此选项时,读写方法不会阻止,而是尽可能多地读取和写入。
你能读多少取决于内核为套接字分配的读缓冲区中的数据字节数,你能写多少取决于内核为套接字写缓冲区分配的数据字节数。
读写方法将通过返回值告诉程序它已经读写了多少字节。
非阻塞IO是指在读写时,线程不必被阻塞,读写可以瞬间完成,线程可以继续做其他事情。
00-1010无阻塞IO非常快,但也带来了一个问题。当线程读取数据时,它会在读取一部分数据后返回,但剩余的数据何时会继续读取?写数据时,缓冲区已满,但还没有写完。剩余数据何时继续写入?
当你可以继续阅读或写作时,你应该给申请人一个通知,告诉申请人你可以继续阅读或写作。事件轮询API用来处理这个问题。
select
系统向用户程序提供选择功能。输入是读写描述符列表read_fds write_fds,输出是对应的可读可写事件。
同时,还提供了超时参数。线程最多可以等待超时。在此期间,当事件到来时,方法将立即返回,线程将向下处理。如果超过超时,该方法也将返回。
如果得到了事件,线程就可以逐个处理对应的事件,然后在处理完之后继续调用select api进行轮询,所以线程其实就是一个无限循环,不停的选择、处理、来回。这个无限循环叫做事件循环,循环就是循环。
事件循环伪代码:
当你
read_events,write_events=select(read_fds,write_fds,超时)
foreventinread _ events:
handle_read(event.fd)
foreventinwrite _ events:
handle_write(event.fd)
Handle_others()#执行其他逻辑处理、定时任务等等。我们可以通过select函数处理多个通道描述符的读写事件,所以我们称之为系统函数调用,比如select一个复用API。
现代操作系统的复用API已经从选择系统调用变成了epoll(linux)和kqueue(FreeBSD,macosx)。
当描述符较多时,select的性能会很差。epoll和select略有不同,但两者都可以通过上面的伪代码理解,即当描述符有事件时,描述符的事件循环处理。
serversocket对象的读取操作指的是调用accept来接受客户端的新连接,当连接到来时,它也会被名为select的读取事件通知。
Java中的NIO技术是事件轮询,其他语言也有。
这个技术。
指令队列
Redis为每一个客户端套接字关联一个指令队列,客户端发来的指令通过队列进行先进先出的顺序处理。
响应队列
同样Redis返回的结果也通过为每个客户端关联的一个队列返回,如果队列为空,则暂时不需要去获取写事件,
此时会将该客户端描述符从write_fds里移除,等队列有数据的时候,再将描述符放进去,这样可以避免select系统调用返回写事件时,发现没数据可写,造成空轮询、无用轮询,对机器CPU的消耗。
定时任务
服务器不单要响应IO事件,有些其他的事情也需要处理,例如应用程序自身的定时任务,如果线程阻塞在select调用上,等待select的返回,这会造成有些定时任务到期了,却没有执行,
Redis的定时任务记录在一个称为 最小堆 的数据结构中,这个堆中,最快要执行的任务排在最上方,每个循环周期里,redis会对堆中已经到时间点的任务进行处理,
处理完毕后,将堆中即将要执行的任务还需要的时间记录下来,再次调用select时,这个时间就是timeout的值,在这期间内不会有其他任务需要执行了,redis可以放心的最多阻塞这么久,然后到时间后进行相应的处理。
NodeJs和Nginx的事件处理原理和Redis也是类似的形式。
关于“Redis中线程IO模型是什么”这篇文章就分享到这里了,希望
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/154412.html