首页 > 技术文章 > Redis_多路复用原理

LZXX 2022-05-28 18:10 原文

1.为什么大数据高并发要用Redis

  平常的客户端 请求mysql等数据库 需要socket四元件

  第一慢:需要进行IO操作,无序的读取or插入
  第二慢:在第一慢的基础上,连接数据库(每次只能请求和处理1个请求,而这个请求是阻塞的),请求超时,就不能进行高并发

      就像买票排队,人超出食堂门口,就处理不了

而redis把第一慢io操作变成内存操作,数据存储内存中第二慢:连接队列超时问题-通过Io多路复用

 所以redi解决了两个大问题:1.直接操作内存,2.解决Io阻塞,通过多路复用,由系统帮你监听链接,只要有事件处理,系统调redis的回调函数,把监听事件交给了系统,释放了我们的代码

所以:redis的异步多线程是由系统完成的,而普通的异步IO是自己写程序调用的。

多路复用是操作系统提供的, reidis能使用Linux是因为用C语言写的,而.net底层里面并没有调用Linux的多路复用代码API

 

Redis基于Reactor模式开发了网络事件处理器也叫文件事件处理器,组成部分:多个套接字,IO多路复用程序,文件事件分派器,事件处理器,因为文件事件分派器队列的消费是单线程的,所以Redis也叫单线程模型
文件事件处理器使用IO多路复用的程序来监听多个套接字,根据套接字目前执行的任务来为套接字关联不同的事件处理器
当套接字准备好执行答(accept)、读取(read)、写入(write)、关闭(close)等操作时
与操作对应的文件事件就会产生,然后文件事件处理器就会调用套接字关联好的事件处理器来处理这些事件
虽然文件事件处理器是单线程的,单是通过io多路复用程序来监听多个套接字,文件事件处理器又实现了高性能的网络通信,又可以保持好Redis单线程的简单性

服务端在等待连接和等待请求的时候,不能进行任务操作(BIO阻塞

NIO(异步的IO) 如果没有请求,就去干自己的事情,下一次请求看有没有你做的事情

.net 同步socket 如果没有任务 直接阻塞当前线程

.net 异步socket 只不过把之前等待的事情,交给了其他线程

redis:IO多路复用-基于liunx系统-生产环境中一定要安装在liunx

 

redisI/0多路复用如图,多个客户端过来直接把请求交给内核,不用写什么java,.net代码

 

liunx同时间可以有6w多个客户端(链接)  但是windos系统下面的redis最多监听1024个链接

 所以redis在windos使用的系统调用模型是 select  redis在liunx中使用的是Epoll  

 

 

多路复用:就是把监听和阻塞等待是否有请求进来的事情交给系统内核处理而系统直接开启高速通道处理

以下是执行流程

 

 

 

推荐阅读