I/O多路复用-redis单线程模型快的根本原因

文章讲述了从最初的BIO单线程和多线程模型到NIO和IO多路复用的概念,分析了同步、异步、阻塞和非阻塞的区别,并详细介绍了select、poll和epoll函数在处理并发I/O连接时的角色和优化。最后提到了Redis如何利用epoll实现高效的单线程模型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

BIO

BIO单线程模式

BIO多线程模型

NIO

IO multiplexing

select函数:

poll函数:

epoll函数:


首先了解同步和异步,阻塞和非阻塞的概念:

同步:发起请求的一方需要等待操作完成并获得结果后才能继续执行后续的操作,换句话说,同步操作会阻塞当前线程或进程,直到操作完成。

异步:发起请求的一方可以继续执行后续的操作,而不必等待操作完成。异步操作通常会使用回调函数、事件处理器或者轮询的方式来处理结果。在异步模式下,不同的参与方可以独立地进行操作,无需等待其他操作的完成。

阻塞:在阻塞模式下,当一个I/O操作被调用时,程序会一直等待,直到操作完成或者发生错误才会返回结果。在阻塞状态下,调用线程或进程会被挂起,无法进行其他任务,直到I/O操作完成或者超时。

非阻塞:在非阻塞模式下,当一个I/O操作被调用时,程序会立即返回,而不会等待操作完成。如果操作不能立即完成,会返回一个错误或标记来指示当前操作无法立即完成,而不会阻塞调用线程或进程。

阻塞和非阻塞他们描述的是操作等待的状态,同步和异步描述的是操作执行的顺序。


BIO

在没有IO多路复用之前,遇到并发多客户端连接,通常采用 BIO 模型来处理并发多连接问题。

BIO单线程模式

最开始的BIO单线程(同步)模式:

code案例:

public class redisServerBIO {
    public static void main(String[] args) throws IOException {

        ServerSocket serverSocket = new ServerSocket(6379);

        while (true) {
            System.out.println("模拟RedisServer启动------111等待连接");
            Socket accept = serverSocket.accept();
            System.out.println("--------222 成功连接:" + IdUtil.simpleUUID());
            InputStream inputStream = accept.getInputStream();
            int length = -1;
            byte[] bytes = new byte[1024];
            System.out.println("-------333等待读取");
            while ((length = inputStream.read(bytes)) != -1) {
                System.out.println("------444 成功读取 " + new String(bytes,0,length));
                System.out.println("===================" + "\t" + IdUtil.simpleUUID());
                System.out.println();
            }
            inputStream.close();
            accept.close();
        }
    }
}

存在的问题:如果客户端与服务端建立了连接,但连

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值