Redis到底是单线程的还是多线程的呢?

Redis6.0引入多线程来处理数据的读写和协议解析,采用 I/O 多路复用技术,并发处理连接。采用了 epoll + 自己实现的简单的事件框架

但是redis执行命令还是单线程的。

追问:那为什么引入多线程呢?

因为redis的性能瓶颈在于网络IO而非CPU,使用多线程能够提高IO读写效率,从而提升整体性能。

追问:那你说说IO多路复用模型

画外音:为了方便理解,以老师收作业场景来类比一下,学生做完作业可以收作业

同步阻塞:逐个收作业,有一个学生没做完就等他昨晚,再收后面的

同步非阻塞:逐个收作业,有学生没做完,那就跳过他收下一个

select/poll:学生写完作业会举手,但是你近视,需要一个个去询问谁做完了。(比同步非阻塞好的地方在于,你去收作业肯定能收到)

epoll:学会写完作业会举手,你不近视,知道他举手就去收他作业。

IO多路复用,核心思想就是让单个线程去监视多个连接,一旦某个连接就绪,也就是触发了读写事件。就通知应用程序,去获取这个就绪的连接进行读写操作。

在IO多路复用的实现原理中,客户端请求到服务端后,此时客户端在传输数据过程中,为了避免server端在read客户端数据过程中阻塞,服务端会把该请求注册到Selector复路器上,服务端此时不需要等待,只需要启动一个线程,通过selector.select()阻塞轮询复路器上就绪的channel即可。也就是说,如果某个客户端连接数据传输完成,那么select()方法会返回就绪的channel,然后执行相关的处理就可以了。

alt

常见的IO多路复用机制的实现方式有:select、poll、epoll

其中select和poll都是基于轮询的方式去获取就绪连接,epoll是基于事件驱动的方式获取就绪连接,性能更好。

重生之八股仙帝 文章被收录于专栏

曾有一千古奇人,精修八股文,成遁世之高人,彻天彻地畅游天地间。 今人皆忙忙,急于求成,岂不知八股乃道门口径,背负天人,若经熟读背诵,更能开拓智慧之门,探寻未来之路。 天下繁华,不尽长夜,唯有读书为伴,熟读八股文更是攀登高峰之路。磨砺文字,升腾智慧,唯有勤玉立志,始可破天荒,登临九重不竭之巅! 吾辈修炼之路,虽曲折荆棘,但信念不曾磨灭,唯有铭记八股精髓,方能指引灵魂归宿,成就一生辉煌!

全部评论

相关推荐

1 1 评论
分享
牛客网
牛客企业服务