面试官:Redis新版本开始引入多线程,谈谈你的看法?.docxVIP

面试官:Redis新版本开始引入多线程,谈谈你的看法?.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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)

bob157641554 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档