众所周知Redis是单进程单线程的应用,在如今多核横行的时代,我们不免有疑问,单线程的redis怎么就成了高性能的代表

当有多个线程同时调用redis的时候,那么单线程的redis是怎么处理的呢,这里就不得不说redis内部的IO模型

首先要提到几个概念,阻塞IO,非阻塞IO,同步IO,异步IO,多路复用

首先我们要理解IO的过程才能更好的理解上面这几种情况,IO分为两步,第一阶段是数据准备,第二阶段是数据复制阶段,所谓数据复制阶段就是讲数据从内核复制到用户空间

所谓阻塞IO,即我们传统的阻塞概念,当一个客户端请求发起之后线程会挂起,等待服务端返回请求结果然后继续处理业务逻辑

非阻塞IO,有人认为非阻塞==异步,其实这个是不准确的,非阻塞IO的非阻塞其实只要体现在IO的第一阶段,非阻塞IO会定时check服务端的数据准备情况,这个阶段是非阻塞的,但是一旦数据准备阶段完成了,线程就会阻塞的进行IO的第二阶段,即数据复制,所以非阻塞IO还是属于同步IO

所以只要有线程阻塞的情况都是属于同步IO,线程完全不会阻塞挂起的才是真正的异步IO

多路复用API,多路复用最常用的就是select和epoll,多路复用的最大的特点就是多路,一个select可以同时处理多个套接字的读写请求,这时候IO的阻塞点往往是多路复用的API,而不是IO操作本身

在redis中的IO模型就是使用多路复用API进程客户端的检测,多路复用API可以同时监听多个客户端的读写操作,多路复用API会检测客户端的请求是读操作还是写操作,往往API会有一个timeout,在这个时间内redis线程会阻塞,进行套接字的监听,redis会给每个客户端套接字匹配一个指令队列,按照队列进行处理,同时也会将操作结果放到输出队列

正是通过这种多路复用的思想进行非阻塞的IO,这样才保证了redis的高效

最新文章

  1. 架构之路(八)从CurrentUser说起
  2. 虚拟机安装的UBUNTU怎么全屏
  3. Flink -- Failover
  4. CSharpThinking---C#版本总结(附加三)
  5. spring实战六之使用基于java配置的Spring
  6. JSP执行过程
  7. MySQL加强
  8. PYTHON ASP FRAMEWORK
  9. tornado with MySQL, torndb, django model, SQLAlchemy ==> JSON dumped
  10. 【转】Wi-Fi 20mhz 和 40mhz 频段带宽的区别是什么?
  11. [Swift]LeetCode888. 公平的糖果交换 | Fair Candy Swap
  12. [记录]一个有趣的url请求(nodejs)
  13. MyEclipse配置Struts2的本地工作空间中的DTD约束文件
  14. IDA修改游戏
  15. ERROR:tornado上传文件过大超出范围报错
  16. linq判断一个枚举的Name是否存在
  17. JVM 之:Java 内存区域与内存溢出
  18. SyntaxError: Non-ASCII character '\xe5' in file test.py on line 1, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
  19. vscode调试typescript
  20. 180623-SpringBoot之logback配置文件

热门文章

  1. BS4库详解
  2. Assignment5: 使用Visual Studio 进行可编码的UI测试
  3. Amazon aws s3 加速
  4. System.Net.WebRequestMethods.cs
  5. Flutter Container容器组件、Text文本组件详解
  6. shell编程系列16--文本处理三剑客之awk模式匹配的两种方法
  7. C++11使用make_shared的优势和劣势
  8. 安装ORACLE服务出现Oracle Net Configuration Assistant 失败问题【我】
  9. Linux记录-批量安装LNMP(转载)
  10. matlab基本函数sort