上回说到小枫在接受面试官的拷打,所幸第一个疑问回答的还不错,因此面试官关于小枫的初步印象还行。咱们接着来看看小枫是怎样和面试官继续过招的吧,他还能扛得住面试官几个连环炮呢?
面试官:Redis了解吗?说说为什么复线程的Redis可以允许高并发访问?
面试官调查目标剖析:
1、调查候选同窗关于Redis原理的了解水平;
2、调查候选同窗关于网络衔接的了解水平;
面试题剖析
面试官的疑问中蕴含了两个关键词,一个是复线程一个是高并发访问,因此咱们在回答疑问的时刻重要从两个方面登程,先解释分明为什么Redis选用复线程的成功模式,再解释分明为什么Redis能允许高并发访问。
小枫:(心坎OS:依据面试官的疑问,选择从两方面来启动论述,先整顿下回答思绪)
从Redis自身个性来说,Redis是基于内存的数据库,所以数据处置速度十分快。另外它的底层经常使用了很多效率很高的数据结构,如哈希表和跳表等。另外Redis从狭义下面来说他是复线程的,网络恳求解析与数据读写都是由主线程成功。因此它外部就省去了很多多线程访问共享数据资源的繁琐设计,同时也防止了频繁的线程高低文切换因此缩小了多线程的系统开支。
从IO模型角度来说,Redis经常使用的是IO多路复用模型,使得它可以在网络IO操作并发处置数十万的客户端网络衔接,成功十分高的网络吞吐率。这也是Redis可以成功高并发访问的最重要的要素。
PS:关于IO模型可以参考以前的文章
一文说清BIO、NIO、AIO不同IO模型演进之路
面试官:刚才你提到了IO多路复用模型,能详细说下Redis的IO多路复用的原理吗?
小枫:(心坎OS:过后为了搞分明这个疑问,还特地扒了Redis源码来看,关于一个Java程序猿来说,看c真的头晕啊)
好的。首先要明白的是Redis依赖Linux操作系统成功的高功能IO,刚刚提到的多路复用IO模型实践也是传统阻塞型IO模型演变而来的。在传统的网络IO操作中,accept()和recv()函数都是阻塞型的,一旦出现阻塞,影响其余网络衔接。然而在多路复用IO模型中,可以成功同时存在多个socket,内核监听socket中的能否有数据恳求或许衔接恳求,假设有恳求,那么内核就会交给Redis启动处置,因此Redis的主线程,也就是复线程的Redis可以处置多个IO衔接。
整个环节触及到epoll_create、epoll_ctl以及epoll_wait三个系统调用,详细的环节大抵是这样的:
1、当Redis启动的时刻,会调用内核的epoll_create创立epoll对象,在这个环节中蕴含初始化红黑树cache以及双向链表,红黑树中重要存储了须要启动形态监控的FD,实践就是epitem结构体,双向链表中存储了须要前往给用户曾经处于就绪形态的事情。
2、调用epoll_ctl(),经过epoll_ctl注册要监听的事情类型,将客户端FD以及须要监听的事情增加到红黑树cache中,增加时启动审核,假设已存在则前往,假设不存在则增加到节点当中,同时注册相应的事情回调函数,假设存在衔接事情或许读写事情,那么就会经过回调函数迁就绪的事情参与到双向链表中,实践就是红黑树的节点。
3、Redis调用epoll_wait失掉曾经就绪的事情的fired数组,fire数组的事情中存储了就绪的FD以及事情类型,遍历数组中的事情,依据事情类型处置函数继续后续的处置。假设是读事情那就调用读事情处置函数启动处置。关于Redis来说它只需关注链表中有没有数据就好,有数据就会启动读取,没有数据则阻塞超越timeout之后再启动调用。在大少数状况下,前往的数组中蕴含的事情并不多。经过这样的设计,Redis不须要不时轮训审核究竟有没有实践的恳求出现,防止了CPU资源的糜费。因此及时是复线程的Redis,借助于epoll机制,它也可以成功数十万衔接的并发处置。
面试官:(心坎OS:小伙子回答的不错,看来经常出现的面试题难不倒你啊,那么我就来问问圈套题吧,嘿嘿)
程序猿小枫这次体现不错,抗住了面试官关于Redis的连环炮,那么接上去的疑问他还能回答进去吗?请大家继续刮目相待哦。
本网站的文章部分内容可能来源于网络和网友发布,仅供大家学习与参考,如有侵权,请联系站长进行删除处理,不代表本网站立场,转载联系作者并注明出处:https://clwxseo.com/wangluoyouhua/8756.html