点击上方☝Java编程技术乐园,轻松关注!及时获取有趣有料的技术文章

做一个积极的人

编码、改bug、提升自己

我有一个乐园,面向编程,春暖花开!

上一篇回顾:

面试官:Redis为什么设计成单线程的?

一、Redis为什么是单线程

注意:redis 单线程指的是网络请求模块使用了一个线程,即一个线程处理所有网络请求,其他模块仍用了多个线程。

因为CPU不是Redis的瓶颈。Redis的瓶颈最有可能是机器内存或者网络带宽,既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。关于redis的性能,官方网站也有,普通笔记本轻松处理每秒几十万的请求。

二、Redis为什么这么快

1、完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1);

2、数据结构简单,对数据操作也简单,Redis中的数据结构是专门进行设计的;

3、采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;

4、使用多路I/O复用模型,非阻塞IO;

5、使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求;

三、多路I/O复用模型,非阻塞IO

下面举一个例子,模拟一个tcp服务器处理30个客户socket。

假设你是一个监考老师,让30个学生解答一道竞赛考题,然后负责验收学生答卷,你有下面几个选择:

1. 第一种选择:按顺序逐个验收,先验收A,然后是B,之后是C、D。。。这中间如果有一个学生卡住,全班都会被耽误。

这种模式就好比,你用循环挨个处理socket,根本不具有并发能力。

2. 第二种选择:你创建30个分身,每个分身检查一个学生的答案是否正确。这种类似于为每一个用户创建一个进程或者线程处理连接。

3. 第三种选择,你站在讲台上等,谁解答完谁举手。这时C、D举手,表示他们解答问题完毕,你下去依次检查C、D的答案,然后继续回到讲台上等。此时E、A又举手,然后去处理E和A。。。

这种就是IO复用模型,Linux下的select、poll和epoll就是干这个的。将用户socket对应的fd注册进epoll,然后epoll帮你监听哪些socket上有消息到达,这样就避免了大量的无用操作。此时的socket应该采用非阻塞模式。

这样,整个过程只在调用select、poll、epoll这些调用的时候才会阻塞,收发客户消息是不会阻塞的,整个进程或者线程就被充分利用起来,这就是事件驱动,所谓的reactor模式。

针对上面的举例在Redis中表现为

有30个redis客户端(考生)与redis服务器的网络连接模块(监考老师)保持TCP连接,客户端会不定时的发送请求给服务器,当有一个redis客户端发起请求,会触发unix系统像epoll这样的系统调用,Redis的I/O 多路复用模块封装了底层的epoll这样的 I/O 多路复用函数,然后转发到相应的事件处理器。

最后多路I/O复用模型图

文件事件处理器使用 I/O 多路复用模块同时监听多个 FD(文件描述符),当 accept、read、write 和 close 文件事件产生时,文件事件处理器就会回调 FD 绑定的事件处理器。

虽然整个文件事件处理器是在单线程上运行的,但是通过 I/O 多路复用模块的引入,实现了同时对多个 FD 读写的监控,提高了网络通信模型的性能,同时也可以保证整个 Redis 服务实现的简单。

持续推送Redis相关技术,欢迎关注~ 后台回复【秘籍】,获取珍藏的武功秘籍!一起来修炼

redis为什么是单线程_面试官:Redis单线程为什么执行效率这么高?相关推荐

  1. redis性能吞吐量瓶颈_面试官:如何用慢查询找到 Redis 的性能瓶颈?

    概述 Redis数据库是一个基于内存的 key-value存储系统,现在redis最常用的使用场景就是存储缓存用的数据,在需要高速读/写的场合使用它快速读/写,从而缓解应用数据库的压力,进而提升应用处 ...

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

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

  3. redis 设置不过期_面试时 Redis 内存淘汰总被问,但是总答不好,怎么解决?

    什么是内存淘汰 内存淘汰,和平时我们设置redis key的过期时间,不是一回事:内存淘汰是说,假设我们限定redis只能使用8g内存,现在已经使用了这么多了(包括设置了过期时间的key和没设过期时间 ...

  4. jqgrid为什么表头和数据之间有间隙_面试官:你看过Redis数据结构底层实现吗?...

    面试中,redis也是很受面试官亲睐的一部分.我向在这里讲的是redis的底层数据结构,而不是你理解的五大数据结构.你有没有想过redis底层是怎样的数据结构呢,他们和我们java中的HashMap. ...

  5. redis订阅执行一段时间自动停止_面试系列 redis 分布式锁amp;数据一致性

    分布式锁 多个系统同时操作一个redis,因为jvm锁是线程级别的,所以没有办法锁住多个系统. Redis锁实现: setnx key value 只有在key不存在时设置key的值 此时key相当于 ...

  6. Redis综述篇:与面试官彻夜长谈Redis缓存、持久化、淘汰机制、哨兵、集群底层原理!...

    点击上方关注 "终端研发部" 设为"星标",和你一起掌握更多数据库知识 于哥你好,最近面试挺多的,尤其是在问到java面试题,Redis被问的特别多,比如Red ...

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

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

  8. redisserver是什么问题_面试官老是问:为什么采用单线程的Redis也会如此之快?...

    Java面试笔试面经.Java技术每天学习一点 公众号Java面试 关注我不迷路 作者:kaito 来源:http://kaito-kidd.com/2020/06/28/why-redis-so-f ...

  9. java如何实现redis分片存储_面试官:你说一下Redis吧,怎么实现高可用,还有持久化怎么做的?...

    前言 作为Java程序员,在面试过程中,缓存相关的问题是躲不掉的,肯定会问,例如缓存一致性问题,缓存雪崩.击穿.穿透等.说到缓存,那肯定少不了Redis,我在面试的时候也是被问了很多关于Redis相关 ...

最新文章

  1. kalilinux安装VMware Tools(水文)
  2. 智能车竞赛技术报告 | 双车接力组 - 沈阳航空航天大学 - 精神小车成双 - 三轮车
  3. Vivado中用于时钟操作的几个Tcl命令
  4. css outline color,css outline-color属性怎么用
  5. 使用 iPerf 测试 Azure VM 之间的网速
  6. 使用Spring Security和jdbc的Spring Boot
  7. oracle   SQL执行过程
  8. 高中辅导班为何改名成培训机构了?
  9. 人工智能(一):技术发展史
  10. 饿了么的谁去拿外卖源码
  11. 如何开始使用 Java 机器学习
  12. 地图切图 java_多任务切图 | SuperMap iDesktop Java
  13. html5移动端海报制作,H5制作利器,教你分分钟制作高/大/上H5海报!
  14. 《老路用得上的商学课》46-50学习笔记
  15. Python调用阿里API进行车牌识别
  16. 游戏代理加盟需要什么条件?
  17. 玉柴spn码故障对照表_BOSCH共轨系统EDC7_V47故障码列表_发布(含SPN和FMI).pdf
  18. Ubuntu安装nvm
  19. Squeeze-and-Excitation Networks论文翻译——中文版
  20. 人脸识别测温一体道闸机省时更省力

热门文章

  1. 学生计算机教室管理规章制度,学校规章制度之小学信息技术教室管理制度
  2. python 使用session_使用session和只使用session有什么区别
  3. 列标题 如何删除gridcontrol_DEV控件GridControl常用属性设置(转)
  4. java 虚拟机 初始化_Java虚拟机 类初始化 阶段
  5. 怎么去控制浏览器对资源文件的处理行为
  6. 从方法论到零售客户实践 解码阿里巴巴数据中台——2018上海云栖大会
  7. IDNO简单生成方法
  8. 防Xss攻击,包含富文本编辑器的处理
  9. 《Redis设计与实现》简读
  10. 2012 RDS Remote App 对于win7的支持问题