美团面试:Redis是单进程单线程?支持多线程?

文摘   2024-11-11 15:21   四川  

关注mikechen十余年BAT架构经验倾囊相授!


大家好,我是mikechen。

Redis是单线程还是多线程?是单进程还是单线程?..等等,这个是大厂经常被问到的话题,下面来全面详解@mikechen


最新mikechen原创超30万字《阿里架构师进阶专题合集》和《大厂最全面试题及答案合集》,请关注本公众号【mikechen的架构笔记】,后台回复:合集,即可领取。

具体来说,Redis使用一个单独的线程处理绝大部分的任务,包括:数据读写...等,但最新的版本已经包含多线程的功能。


首先,从单线程谈起,单线程依然是核心处理。

Redis单线程处理数据的方式之所以高效,是因为它利用了:I/O多路复用机制,可以同时处理多个客户端的请求。

I/O多路复用机制(I/O Multiplexing):是指在一个线程中,同时监控多个I/O通道。

比如:网络连接、文件描述符。。。等,这种机制可以显著提高系统的性能,特别是在需要同时处理多个客户端请求的场景中。

在Redis中,I/O多路复用机制,使单线程也能够同时处理大量的客户端请求。

通过该机制,Redis能够高效地管理成千上万个并发连接,实现高性能的数据读写。

实现原理,如下图所示:

Redis利用操作系统,提供的多路复用系统调用(如:select、poll、epoll等),来监听多个客户端的网络套接字。

select

是最早的I/O多路复用机制,允许在一个线程中监视多个文件描述符。

它通过检查每个描述符的状态(可读、可写、异常等)来处理I/O操作。

select的缺点是当监控的文件描述符数目增加时,其性能会大幅下降,因为它需要每次都检查所有描述符的状态。

poll

poll的原理类似于select,但是它解决了select在文件描述符数量过多时的性能问题。

poll不使用固定的文件描述符数量,而是使用链表来存储需要监视的文件描述符,因此可以支持更多的描述符。

epoll

epoll是Linux系统中的I/O多路复用机制,是对select和poll的优化,与它们不同,epoll是基于事件驱动的。

epoll,使用一个内核空间的事件通知机制,效率更高,并且,epoll可以支持大量并发连接,而且不需要在每次调用时遍历所有文件描述符。

因此,在高并发场景中性能优异,Redis在Linux系统中优先选择epoll。

此外,Redis的绝大多数操作都是内存操作,结合I/O多路复用,最大程度上避免了I/O等待,从而实现了高性能的数据处理能力。

不过,Redis也在特殊情况下使用多线程,比如:持久化操作...等等。

Redis支持,将内存数据写入磁盘(RDB、和AOF),在一些耗时较长的持久化操作中,Redis会启用子进程进行。

而且,从Redis 6.0开始,它增加了多线程支持(用于处理网络请求的读写操作),但数据处理仍然在单线程中完成,因此总体架构仍保持单线程特性。

以上


最后送大家一个福利:

送我原创超30万字阿里架构师进阶专题合集


以及给大家整理最全大厂Java面试题及答案详解,包含:Java、多线程、JVM、Spring、MySQL、Redis、中间件...等必考题答案详解。


需要以上架构专题&面试答案的同学,加我微信即可领取!


添加时备注:资料


mikechen的架构笔记
十余年BAT架构经验倾囊相授!
 最新文章