文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

面试官:为什么单线程的 Redis 可以实现高并发访问

2024-12-02 11:15

关注

面试官考察目的分析

面试官:Redis了解吗?说说为什么单线程的Redis可以支持高并发访问?

面试官考察目的分析:

考察候选同学对于Redis原理的理解程度;

考察候选同学对于网络连接的理解程度;

面试题分析

面试官的问题中包含了两个关键词,一个是单线程一个是高并发访问,因此我们在回答问题的时候主要从两个方面出发,先解释清楚为什么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三个系统调用,具体的过程大致是这样的:

当Redis启动的时候,会调用内核的epoll_create创建epoll对象,在这个过程中包含初始化红黑树cache以及双向链表,红黑树中主要存储了需要进行状态监控的FD,实际就是epitem结构体,双向链表中存储了需要返回给用户已经处于就绪状态的事件。

调用epoll_ctl(),通过epoll_ctl注册要监听的事件类型,将客户端FD以及需要监听的事件添加到红黑树cache中,添加时进行检查,如果已存在则返回,如果不存在则添加到节点当中,同时注册相应的事件回调函数,如果存在连接事件或者读写事件,那么就会通过回调函数将就绪的事件加入到双向链表中,实际就是红黑树的节点。

Redis调用epoll_wait获取已经就绪的事件的fired数组,fire数组的事件中存储了就绪的FD以及事件类型,遍历数组中的事件,根据事件类型处理函数继续后续的处理。如果是读事件那就调用读事件处理函数进行处理。对于Redis来说它只要关注链表中有没有数据就好,有数据就会进行读取,没有数据则阻塞超过timeout之后再进行调用。在大多数情况下,返回的数组中包含的事件并不多。通过这样的设计,Redis不需要一直轮训检查到底有没有实际的请求发生,避免了CPU资源的浪费。因此及时是单线程的Redis,借助于epoll机制,它也可以实现数十万连接的并发处理。

面试官:(内心OS:小伙子回答的不错,看来常见的面试题难不倒你啊,那么我就来问问陷阱题吧,嘿嘿)

总结

程序猿小枫这次表现不错,抗住了面试官关于Redis的连环炮,那么接下来的问题他还能回答出来吗?请大家继续拭目以待哦。

本文转载自微信公众号「慕枫技术笔记」,可以通过以下二维码关注。转载本文请联系慕枫技术笔记公众号。

 

来源:慕枫技术笔记内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯