前言
可能所有人都知道,Redis采用了单线程的模型设计,单线程又是如何做到每秒百万级的客户端请求的呢?4.0+版本之后引入了多线程,是放弃了单线程设计模型吗?实际上无论是早起的单线程模型还是后期的多线程模型,设计上并没有根本性的冲突。
Redis单线程模型
Redis虽然采用了单线程模型,但是依然能够并发的处理任务,关键在于采用了IO多路复用技术,最重要的select函数就是利用多路复用同时监控多个FD(文件描述符
)的状态,当有FD可读或可写时通知select进程。
select整体对外表现为阻塞式,但是通过多路复用达到同时处理多个用户请求的目的。
Redis顶层设计理念
另外Redis并不是CPU密集型的服务,性能瓶颈主要是网络延迟或等待客户端数据传输(网络I/O
)。
基于以上一些特性,redis采用单线程依然能够满足高并发的处理需求。
Redis多线程模型
Redis在4.0版本之后引入了多线程的概念,但是与之前的单线程模型实际上并不冲突,这些额外的线程是用于一些异步处理操作,比如删除过期数据等。主处理线程依然采用单线程模型。
PS:个人对redis的多路复用理解的比较浅薄,有时间再深入学习操作系统的IO多路复用原理,相信会对redis的多路复用会有更深刻的认识。