背景

上回说到小枫在接受面试官的拷打,所幸第一个问题回答的还不错,因此面试官对于小枫的初步印象还行。我们接着来看看小枫是怎么和面试官继续过招的吧,他还能扛得住面试官几个连环炮呢?

面试官考察目的分析

面试官:Redis了解吗?说说为什么单线程的Redis可以支持高并发访问?
面试官考察目的分析:
1、考察候选同学对于Redis原理的理解程度;
2、考察候选同学对于网络连接的理解程度;

面试题分析

面试官的问题中包含了两个关键词,一个是单线程一个是高并发访问,因此我们在回答问题的时候主要从两个方面出发,先解释清楚为什么Redis选择单线程的实现方式,再解释清楚为什么Redis能支持高并发访问。

小枫:(内心OS:根据面试官的问题,决定从两方面来进行阐述,先整理下回答思路)

从Redis自身特性来说,Redis是基于内存的数据库,所以数据处理速度非常快。另外它的底层使用了很多效率很高的数据结构,如哈希表和跳表等。另外Redis从狭义上面来说他是单线程的,网络请求解析与数据读写都是由主线程完成。因此它内部就省去了很多多线程访问共享数据资源的繁琐设计,同时也避免了频繁的线程上下文切换因此减少了多线程的系统开销。

从IO模型角度来说,Redis使用的是IO多路复用模型,使得它可以在网络IO操作并发处理数十万的客户端网络连接,实现非常高的网络吞吐率。这也是Redis可以实现高并发访问的最主要的原因。

面试官:刚才你提到了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:小伙子回答的不错,看来常见的面试题难不倒你啊,那么我就来问问陷阱题吧,嘿嘿)

有道无术,术可成;有术无道,止于术

欢迎大家关注Java之道公众号

好文章,我在看❤️

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

  1. 面试官绝杀:系统是如何支撑高并发的?

    作者 | 中华石杉 责编 | 伍杏玲 很多人面试的时候被问到一个让人特别手足无措的问题:你的系统如何支撑高并发? 大多数同学被问到这个问题压根儿没什么思路去回答,不知道从什么地方说起,其实本质就是没经 ...

  2. 500并发 一台服务器的性能_面试官绝杀:系统是如何支撑高并发的?

    作者 | 中华石杉 责编 | 伍杏玲 本文经授权转载石杉的架构笔记(ID:shishan100) 很多人面试的时候被问到一个让人特别手足无措的问题:你的系统如何支撑高并发? 大多数同学被问到这个问题压 ...

  3. 面试官:你对Redis缓存了解吗?面对这11道面试题是否有很多问号?

    关于Redis的知识总结了一个脑图分享给大家 1.在项目中缓存是如何使用的?为什么要用缓存?缓存使用不当会造成什么后果? 面试官心理分析 这个问题,互联网公司必问,要是一个人连缓存都不太清楚,那确实比 ...

  4. 面试官:你对Redis缓存了解吗?面对这11道面试题你是否有很多问号?

    前言 关于Redis的知识,总结了一个脑图分享给大家 1.在项目中缓存是如何使用的?为什么要用缓存?缓存使用不当会造成什么后果? 面试官心理分析 这个问题,互联网公司必问,要是一个人连缓存都不太清楚, ...

  5. 面试官问我为什么Redis这么快,我.......

    开课开课~ 面试官:为什么项目中用Redis? 我:当然是因为Redis好啊 面试官:emmm.....那Redis哪里好? 我:因为Redis快啊. 面试官:(这小伙子有点彪啊...)那为什么Red ...

  6. 面试官问我:Redis 内存满了怎么办

    转载自 想不到!面试官问我:Redis 内存满了怎么办 Redis占用内存大小 Redis的内存淘汰 LRU算法 LRU在Redis中的实现 LFU算法 问题 Redis占用内存大小 我们知道Redi ...

  7. 面试官:你对Redis缓存了解吗?面对这5道面试题是否有很多问号?

    1.redis 集群模式的工作原理能说一下么?在集群模式下, redis 的 key 是如何寻址的?分布式寻址都有哪些算法?了 解一致性 hash 算法吗? 面试官心理分析 在前几年,redis 如果 ...

  8. 当面试官说刚入职工资不高时该怎么回答呢

    职场中,面试是每个人都需要面对的关卡,也是决定我们最终是否可以入职的,拿到Offer的关键.在面试中,我们常常会遇到这样一个问题,当面试官说刚入职工资不高时该怎么回答呢?江苏中小学教师招聘整理了如下的 ...

  9. 利用Redis锁解决高并发问题

    利用Redis锁解决高并发问题 参考文章: (1)利用Redis锁解决高并发问题 (2)https://www.cnblogs.com/yszr/p/11698696.html 备忘一下.

最新文章

  1. 去掉VS2012中的红色波浪下划线
  2. php图片滑动代码,jQuery如何实现图片滑动效果
  3. 学习:springMVC注解
  4. python shape函数_Python中的多态及抽象类
  5. Redis中使用Lua语言
  6. 施一公:如何提高英文的科研写作能力
  7. 原创 | 一文了解那些和Spring Bean有关的那些注解!
  8. PythonSpot 中文系列教程 · 翻译完成
  9. zynq中纯Programmable Loigc编程
  10. 【火炉炼AI】深度学习006-移花接木-用Keras迁移学习提升性能
  11. 趣谈网络协议——HTTPS协议
  12. 监控服务器系统密码忘了怎么办,监控服务器登录密码忘记了怎么办
  13. 五分钟使用WebStack构建个人网址导航
  14. CAD贱人工具箱插件
  15. 面试题之 【挖金矿问题】
  16. 【C语言-11】Bingou! ~~~~三个数字从大到小排排坐~~
  17. 前后端报文传输加密方案
  18. 杭电oj 2081 手机短号(C++)
  19. 奔跑的业绩,需要配上奔跑的Excel条形图
  20. 西安工大计算机学院李颖,李颖 -西安交通大学人文社会科学学院

热门文章

  1. Opencv 图片缩小尺寸原理
  2. clone git 修改保存路径_用git管理版本,你必须知道的事情
  3. 高内聚低耦合通俗理解_带你从入门到精通——「高内聚低耦合」
  4. python蟒蛇绘制步骤_如何用python绘制蟒蛇移动的样子-百度经验
  5. java final属性
  6. 计组之指令系统:3、CISC和RISC
  7. Android开发:1-1、UI编程基础----基本介绍
  8. 17. OD-带有多态、变形的程序进行打补丁去掉nag(分析xor加密解密、自身修改代码的程序)
  9. python - 基础算法题1- 使用while循环输入1 2 3 4 5 6 8 9 10
  10. ELK学习笔记之Kibana权限控制和集群监控