- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
面试官:Redis新版本开头引入多线程,谈谈你的看法?
正如官方以前的回复,Redis的功能瓶颈并不在CPU上,而是在内存和网络上。因而6.0发布的多线程并未将大事处理改成多线程,而是在I/O上,此外,假如把大事处理改成多线程,不但会导致锁竞争,而且会有频繁的上下文切换,即便用分段锁来削减竞争,对Redis内核也会有较大改动,功能也不肯定有明显提升。
多线程IO实现
如上图红色部分,就是Redis实现的多线程部分,利用多核来分担I/O读写负荷。在大事处理线程每次猎取到可读大事时,会将全部就绪的读大事安排给I/O线程,并进行等待,在全部I/O线程完成读操作后,大事处理线程开头执行任务处理,在处理结束后,同样将写大事安排给I/O线程,等待全部I/O线程完成写操作。
以读大事处理为例,看下大事处理线程任务安排流程:
int?handleClientsWithPendingReadsUsingThreads(void)?{????...????/*?Distribute?the?clients?across?N?different?lists.?*/????listIter?li;????listNode?*ln;????listRewind(server.clients_pending_read,li);????int?item_id?=?0;????//?将等待处理的客户端安排给I/O线程????while((ln?=?listNext(li)))?{????????client?*c?=?listNodeValue(ln);????????int?target_id?=?item_id?%?server.io_threads_num;????????listAddNodeTail(io_threads_list[target_id],c);????????item_id++;????}????...????/*?Wait?for?all?the?other?threads?to?end?their?work.?*/????//?轮训等待全部I/O线程处理完????while(1)?{????????unsigned?long?pending?=?0;????????for?(int?j?=?1;?j??server.io_threads_num;?j++)????????????pending?+=?io_threads_pending[j];????????if?(pending?==?0)?break;????}????...????return?processed;}
I/O线程处理流程:
void?*IOThreadMain(void?*myid)?{????...????while(1)?{????????...????????//?I/O线程执行读写操作????????while((ln?=?listNext(li)))?{????????????client?*c?=?listNodeValue(ln);????????????//?io_threads_op推断是读还是写大事????????????if?(io_threads_op?==?IO_THREADS_OP_WRITE)?{????????????????writeToClient(c,0);????????????}?else?if?(io_threads_op?==?IO_THREADS_OP_READ)?{????????????????readQueryFromClient(c-conn);????????????}?else?{????????????????serverPanic(io_threads_op?value?is?unknown);????????????}????????}????????listEmpty(io_threads_list[id]);????????io_threads_pending[id]?=?0;????????if?(tio_debug)?printf([%ld]?Done\n,?id);????}}
局限性
从上面实现上看,6.0版本的多线程并非彻底的多线程,I/O线程只能同时执行读或者同时执行写操作,期间大事处理线程一直处于等待形态,并非流水线模型,有很多轮训等待开销。
Tair多线程实现原理
相较于6.0版本的多线程,Tair的多线程实现愈加优雅。如下图,Tair的Main Thread担任客户端连接建立等,IO Thread担任恳求读取、响应发送、命令解析等,Worker Thread线程
文档评论(0)