redis-6.0-thread
其实在6.0之前,redis也是有多线程的,BIO
这个模块就是使用多线程处理关闭文件
,刷新aof数据到磁盘
,惰性释放key
这三件事情。在6.0版本中,redis引入的多线程,只是用来处理跟客户端的网络I/O,这里的多线程同时只在做一件事,只可能同时在读数据,或者同时在写。不会出现,一部分线程读数据一部分写数据的情况。
多线程仅仅是用在网络I/O这块,在执行命令阶段,还是跟之前一样,由主进程依次执行。在一个处理周期内,主线程把有读数据需求的客户端,平均分配到每个子线程的待处理池。然后打开开关,并设置此阶段所有线程的行为为读操作
,之后所有线程开始读取数据,主线程会一直等到所有的子线程都处理完,然后在主线程中依次解析&执行命令。然后主线程把有写数据需求的客户端平均分配到每个子线程的待处理池,打开开关,并设置此阶段所有线程的操作行为为写操作
,之后所有线程开始执行写数据。
上述是大概的多线程流程,实际情况下,并不是每一个处理周期都会用到多线程来处理网络I/O,详细的会在下面介绍。
redis多线程为什么只在网络I/O这块,因为redis的一个核心就是处理命令的时候,使用单线程处理,这样做避免了资源的竞争问题。如果执行命令的过程中改成多线程的话,则需要对大量的资源进行加锁来保证,这样对于redis来说改动是很大的,从DB,到里面的每一个key、value,再到每一个value的数据结构实现,都是需要考虑并发的问题的。