一、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(文件描述符),当 acceptreadwrite 和 close 文件事件产生时,文件事件处理器就会回调 FD 绑定的事件处理器。

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

转载于:https://www.cnblogs.com/chenxiaoxian/p/10427025.html

Redis 为什么是单线程的相关推荐

  1. redis为什么是单线程_面试官:Redis单线程为什么执行效率这么高?

    点击上方☝Java编程技术乐园,轻松关注!及时获取有趣有料的技术文章 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 上一篇回顾: 面试官:Redis为什么设计成单线程的 ...

  2. redis特点单进程单线程高性能服务器,Redis为什么是单线程?Redis又为什么这么快!...

    Java相关的面试都会问到缓存的问题,基础一点的会问到什么是"二八定律".什么是"热数据和冷数据",复杂一点的会问到缓存雪崩.缓存穿透.缓存预热.缓存更新.缓存 ...

  3. 高并发架构系列:Redis为什么是单线程、及高并发快的3大原因详解

    Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快: 2.redis是单线程的,省去了很多上下文切换线程的时间: 3.redis使用多路复用技术,可以处理并发的连接.非阻塞 ...

  4. Redis系列教程(四):Redis为什么是单线程、及高并发快的3大原因详解

    Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快: 2.redis是单线程的,省去了很多上下文切换线程的时间: 3.redis使用多路复用技术,可以处理并发的连接.非阻塞 ...

  5. Redis为什么是单线程?高并发响应快?

    一.Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快(纯内存); 数据存在内存中,数据结构用HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1). ...

  6. Redis 一定是单线程的进程吗?

    一.Redis是单线程吗? Redis 单线程指的是「接收客户端请求->解析请求 ->进行数据读写等操作->发生数据给客户端」这个过程是由一个线程(主线程)来完成的,这也是我们常说 ...

  7. 从开源框架细节的来分析网络模块的封装丨网络模块|Redis|skynet|多线程|单线程|reactor多核实现|IO多路复用

    从开源框架细节的来分析网络模块的封装 视频讲解如下: 从开源框架细节的来分析网络模块的封装丨网络模块|Redis|skynet|多线程|单线程|reactor多核实现|IO多路复用丨c/c++linu ...

  8. Redis 究竟是单线程还是多线程呢?

    1 前言 Redis到底是单线程还是多线程的? 首先,Redis是一个高性能的分布式缓存中间件.其复杂性不言而喻,对于Redis整体而言肯定不是只有一个线程. 我们常说的Redis 是单线程,主要是指 ...

  9. Redis为什么是单线程、及高并发快的大原因详解

    Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快: 2.redis是单线程的,省去了很多上下文切换线程的时间: 3.redis使用多路复用技术,可以处理并发的连接.非阻塞 ...

最新文章

  1. 谷歌开源文本生成新方法 LaserTagger,直击 seq2seq 效率低、推理慢、控制差三大缺陷!
  2. UIWebView中JS与OC交互 WebViewJavascriptBridge的使用
  3. c语言 实现sizeof功能,C语言简单实现sizeof功能代码
  4. 用户用户组及权限管理
  5. 485光纤转换器产品分类介绍
  6. imagick用法!
  7. w3school入门自学免费网站推荐
  8. python request 库传送formdata_Python Requests库 form-data 上传文件操作
  9. deepin桌面为什么那么卡_UOS/Deepin桌面卡死该怎么办
  10. 【亲测】Ripro子主题美化C系列主题(春系列)-开源未加密
  11. foxmail html模板,Foxmail“邮件模板”功能全攻略
  12. 简易网页(HTML)
  13. java中静态方法与非静态方法的区别及非静态方法的注意事项
  14. iOS 如何让APP 删除后不接受 APNS 推送消息
  15. MIT_单变量微积分_18
  16. 功能性与非功能性需求
  17. React.Meno
  18. M2VoC比赛论文——台湾大学
  19. 记者:你为什么还不退休? | 任正非:我上午可以喝茶,下午再喝茶就睡不着了...
  20. matlab fread

热门文章

  1. 关于问题难易程度的解读
  2. 【体系结构 三 流水线技术】
  3. 《八佰》票房超八亿提振影业复苏;女性重疾发病年轻化趋势明显 | 美通企业日报...
  4. LabVIEW循环结构之移位寄存器
  5. kvm介绍与操作文档
  6. 如何安装永中Office
  7. (附源码)计算机毕业设计SSM国际美容会所管理系统
  8. 如何在ppt中生成柱状图_ppt中如何添加柱状图 - 卡饭网
  9. [iOS开发]修改代码问题记录
  10. 面试题:15个人围成圈数数 每逢报数为七的倍数就退出,一直循环下去 ,直到剩下最后一人 ,最后剩余的是第几个人,展示出退出的顺序