关于I/O多路复用(事件驱动),首先要理解的是,操作系统为你提供一个功能,当你的某个socket可读或可写的时候,它可以给你一个通知。这样当配合非阻塞的socket使用时,只有当系统通知我哪个描述符可读了,我才去执行read操作,可以保证每次read都能读到有效数据而不做纯返回或无用功,写操作类似,操作系统的这个功能是通过select/poll/epoll/kqueue之类的系统调用函数来实现,这些函数都可以见识多个描述符的读写就绪状况,这样,多个描述符的I/O操作都能在一个线程内并发交替的顺序完成,这就叫着I/O多路复用,“多路”指的是多个网络连接,“复用”指的是复用同一个Redis处理线程,采用多路I/O复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络I/O的时间消耗),且Redis在内存中操作数据的速度非常快,也就是说内存内的操作不会成为影响Redis性能的瓶颈,所以Redis有很高的吞吐量。
Redis是单线,主要是指Redis的网络IO和键值对读写是由一个线程来完成的。,这也是Redis对外提供键值存储服务的主要流程。但Redis的其它功能,比如持久化,异步删除,集群数据同步等是由额外的线程执行的。为什么要使用单线程?我们经常会听到一种说法:“使用多线程,可以增加系统吞吐率,或者增加系统拓展性”,的确,对于一个多线程的系统来说,在有合理的资源分配的情况下,可以增加系统中处理请求操作的资源实体,进而提升系统能够同时处理的请求数,即吞吐率。但是,请你注意,通常情况下,在我们采用多线程后,如果没有良好的系统设计,实际得到的结果就是:刚开始增加线程数时,系统吞吐率会增加,但是再进一步增加线程时,系统的吞吐率增长变得缓慢或者下降,为什么出现这种情况?一个关键的瓶颈在于:访问共享资源,为了保证共享资源的正确性,就需要有额外的机制进行保证,而这个额外的机制就会带来额外的开销(比如锁)。

Redis采用单线程模型,利用I/O多路复用技术提高处理效率。本文介绍了从传统的BIO到NIO,再到多路复用NIO和epoll的发展过程,阐述了每种模式的工作原理及其优缺点,展示了Redis如何利用epoll实现高效的数据处理。
最低0.47元/天 解锁文章
766

被折叠的 条评论
为什么被折叠?



