前情提要:
《redis 从0到1完整学习 (一):安装&初识 redis》
《redis 从0到1完整学习 (二):redis 常用命令》
《redis 从0到1完整学习 (三):redis 数据结构》
《redis 从0到1完整学习 (四):字符串 SDS 数据结构》
《redis 从0到1完整学习 (五):集合 IntSet 数据结构》
《redis 从0到1完整学习 (六):Hash 表数据结构》
《redis 从0到1完整学习 (七):ZipList 数据结构》
《redis 从0到1完整学习 (八):QuickList 数据结构》
《redis 从0到1完整学习 (九):SkipList 数据结构》
《redis 从0到1完整学习 (十):RedisObject 数据结构》
《redis 从0到1完整学习 (十一):RedisObject 之 String 类型》
《redis 从0到1完整学习 (十二):RedisObject 之 List 类型》
《redis 从0到1完整学习 (十三):RedisObject 之 Set 类型》
《redis 从0到1完整学习 (十四):RedisObject 之 ZSet 类型》
《redis 从0到1完整学习 (十五):RedisObject 之 Hash 类型》
《redis 从0到1完整学习 (十六):内存回收之 key 过期处理策略》
《redis 从0到1完整学习 (十七):内存回收之内存淘汰策略》
之前我们介绍了 redis 的内存回收相关处理策略。Redis 巧妙地结合了非阻塞 I/O 技术和多路复用机制来实现高并发、低延迟的服务能力,这也是它作为高性能缓存数据库的重要原因之一。
为了连续性,本文主要介绍下 Linux 的阻塞和非阻塞 IO 概念,方便后续理解。
Redis 源码可以点击这里下载,方便查看其中定义的一些数据结构。
在操作系统和计算机网络中,通常提到的五种I/O(Input/Output)模型是:
I/O 模型 | 描述 |
---|---|
阻塞I/O (Blocking I/O) | 进程发起I/O操作后,会一直等待(阻塞)直到该操作完成。期间不能执行其他任务。 |
非阻塞I/O (Non-Blocking I/O) | 进程发起请求后立即返回,不关心数据是否准备好。进程需不断轮询检查I/O状态。 |
I/O复用 (I/O Multiplexing) | 单个线程可以同时监听多个文件描述符,当任意一个准备就绪时进行实际I/O操作,如select 、poll 或epoll 。 |
信号驱动I/O (Signal-Driven I/O) | 应用程序注册信号处理器,内核在数据准备就绪时发送信号通知进程,进程在信号处理函数中完成I/O操作。 |
异步I/O (Asynchronous I/O, AIO) | 进程发起I/O请求后立刻返回,内核在后台完成操作并在所有操作完成后通过回调函数通知应用程序。进程中无需关心I/O何时完成也不需要轮询。 |
阻塞I/O(Blocking I/O)的详细过程描述如下:
进程发起调用:
revcfrom
函数来系统调用。内核等待数据准备:
数据准备阶段:
数据复制:
唤醒进程:
进程继续执行:
总结来说,在阻塞 I/O 模型下,进程在等待 I/O 操作完成期间不能执行其他任务,这种模式简单直观,但当 I/O 操作耗时较长时,会导致进程效率低下。在高并发和实时性要求较高的场景下,不建议使用阻塞 I/O 模型。
非阻塞I/O(Non-Blocking I/O)的详细过程描述如下:
进程发起调用:
revcfrom
函数来系统调用。内核处理请求:
EAGAIN
或EWOULDBLOCK
,表示当前无数据可读。轮询与事件循环:
数据准备阶段:
读取数据:
总结来说,在非阻塞 I/O 模型下,进程不会因 I/O 操作而阻塞,而是不断轮询以检测 I/O 事件的状态,当事件发生时才执行实际的 I/O 操作。这种模式能够提高并发处理能力,但也增加了编程复杂度,因为它要求应用开发者自行处理事件循环和轮询逻辑。
《redis 从0到1完整学习 (一):安装&初识 redis》
《redis 从0到1完整学习 (二):redis 常用命令》
《redis 从0到1完整学习 (三):redis 数据结构》
《redis 从0到1完整学习 (四):字符串 SDS 数据结构》
《redis 从0到1完整学习 (五):集合 IntSet 数据结构》
《redis 从0到1完整学习 (六):Hash 表数据结构》
《redis 从0到1完整学习 (七):ZipList 数据结构》
《redis 从0到1完整学习 (八):QuickList 数据结构》
《redis 从0到1完整学习 (九):SkipList 数据结构》
《redis 从0到1完整学习 (十):RedisObject 数据结构》
《redis 从0到1完整学习 (十一):RedisObject 之 String 类型》
《redis 从0到1完整学习 (十二):RedisObject 之 List 类型》
《redis 从0到1完整学习 (十三):RedisObject 之 Set 类型》
《redis 从0到1完整学习 (十四):RedisObject 之 ZSet 类型》
《redis 从0到1完整学习 (十五):RedisObject 之 Hash 类型》
《redis 从0到1完整学习 (十六):内存回收之 key 过期处理策略》
《redis 从0到1完整学习 (十七):内存回收之内存淘汰策略》
欢迎关注本人,我是喜欢搞事的程序猿; 一起进步,一起学习;
也欢迎关注我的wx公众号:一个比特定乾坤