Redis-I/O模型

思维导图

Redis 单线程是指Redis的网络IO和键值对读写是由一个线程完成。这也是Redis提供存储服务的主流程。

一、Redis 单线程原因

对于一个多线程系统,在合理的资源分配情况下,提高线程数,可以有效的提高系统的吞吐量。但实际情况可能是,刚增加线程数时,系统吞吐量增加,但进一步增加线程数,吞吐量增长缓慢,甚至下降。

出现这种情况的原因是系统中多线程可能会竞争同一个临界资源,为了保证临界资源的正确性,需要添加额外的机制,比如锁,而这些额外的机制就会带来额外的开销。这就是多线程编程模式面临的共享资源的并发访问控制问题。为了避免这些问题,Redis采用单线程。
Redis 6.0支持多线程,默认不开启

二、I/O多路复用

Redis采用多路复用机制,使其在网络I/O操作中可以大量并发处理客户端请求,实现高吞吐率。
I/O多路复用 在单线程中通过记录跟踪每一个I/O流的状态来管理多个I/O流。select, poll, epoll 都是I/O多路复用的具体的实现。

1.select/epoll机制

在 Redis 只运行单线程的情况下,该机制允许内核中,同时存在多个监听套接字和已连接套接字。内核会一直监听这些套接字上的连接请求或数据请求。一旦有请求到达,就会交给 Redis 线程处理,这就实现了一个 Redis 线程处理多个 IO 流的效果。

2.Reactor(反应器模式)

图中FD就是套接字,当select/epoll一旦监测到FD上有请求到达时,就会出发相应的事件,这些事件会被放进一个事件队列,Redis 单线程对该事件队列不断进行处理。这样一来,Redis 无需一直轮询是否有请求实际发生,这就可以避免造成 CPU 资源浪费。同时,Redis 在对事件队列中的事件进行处理时,会调用相应的处理函数,这就实现了基于事件的回调。因为 Redis 一直在对事件队列进行处理,所以能及时响应客户端请求,提升 Redis 的响应性能。
事件到了,在处理,这就是反应器模式。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容