众所周知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的高效

Reids原理之IO模型的更多相关文章

  1. 高性能IO模型浅析

    高性能IO模型浅析 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking  ...

  2. IO模型

    前言 说到IO模型,都会牵扯到同步.异步.阻塞.非阻塞这几个词.从词的表面上看,很多人都觉得很容易理解.但是细细一想,却总会发现有点摸不着头脑.自己也曾被这几个词弄的迷迷糊糊的,每次看相关资料弄明白了 ...

  3. 服务器端高性能的IO模型 转自酷勤网

    服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(BlockingIO):即传统的IO模型. (2)同步非阻塞IO(Non-blockingIO):默认创建的soc ...

  4. Linux IO模型和网络编程模型

    术语概念描述: IO有内存IO.网络IO和磁盘IO三种,通常我们说的IO指的是后两者. 阻塞和非阻塞,是函数/方法的实现方式,即在数据就绪之前是立刻返回还是等待. 以文件IO为例,一个IO读过程是文件 ...

  5. 高性能IO模型浅析(彩图解释)good

    服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking IO):默认创建的s ...

  6. 高性能IO模型浅析(转)

    转自:http://www.cnblogs.com/fanzhidongyzby/p/4098546.html 是我目前看到的解释IO模型最清晰的文章,当然啦,如果想要详细的进一步了解还是继续啃蓝宝书 ...

  7. 【珍藏】高性能IO模型浅析

    服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking IO):默认创建的s ...

  8. [转载] 高性能IO模型浅析

    转载自http://www.cnblogs.com/fanzhidongyzby/p/4098546.html 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(B ...

  9. python 浅析IO 模型

    协程:遇到IO操作就切换,但是什么时候切回去呢?怎么确定IO操作? 很多程序员可能会考虑使用"线程池"或"连接池"."线程池"旨在减少创建和 ...

随机推荐

  1. avalon如何用年月日的方式输出..

    在avolon里面的http://avalonjs.coding.me/filter.html  可以找到与date相关的转化,如果是要转化为年月日的形式,看下面的代码: <span style ...

  2. 微信小程序“一劳永逸”的接口封装

    前言 最近都在研究小程序了,我可以的! 需求 之前都是用vue来开发项目的,接口模块我特意封装了一下.感觉也可以记录一下 小程序的接口虽说简单,但是重复调用那么多,显得不专业(一本正经的胡说八道) 还 ...

  3. IdHTTPServer允许跨域访问

    IdHTTPServer允许跨域访问 procedure TMain.idHttpServerCommandGet(AContext: TIdContext; ARequestInfo: TIdHTT ...

  4. 树莓派连接18b20测温度

    树莓派系统包含了18b20的驱动(1-wire interface),我们只需要将其开启即可.有两种开启方式: 方式一:输入raspi-config命令,然后在interfacing options ...

  5. Kafka的Topic、Partition和Message

    Kafka的Topic和Partition Topic Topic是Kafka数据写入操作的基本单元,可以指定副本 一个Topic包含一个或多个Partition,建Topic的时候可以手动指定Par ...

  6. CMU Advanced DB System - Query Optimizer

    Overview Optimizer模块所处在的位置如图, 那么做optimize的目的是, 找出所有‘correct’执行计划中‘cost’最低的 那么这里首先要明确的概念,‘correct’,关系 ...

  7. android: Android水波纹点击效果

    Android API 21及以上新增了ripple标签用来实现水波纹的效果.我们可以通过设置ripple背景来实现一些View点击效果. 该水波纹效果有两种:一种是有界的(点击后类似于一个矩形向四周 ...

  8. Typescript中的类 Es5中的类和静态方法和继承(原型链继承、对象冒充继承、原型链+对象冒充组合继承)

    <!doctype html> <html> <head> <meta charset="utf-8"> <meta name ...

  9. nginx 开启rewrite_log日志

  10. C++17 std::shared_mutex的替代方案boost::shared_mutex

    C++17 std::shared_mutex的替代方案boost::shared_mutex C++17boost  std::shared_mutex http://en.cppreference ...