单线程多路复用和多线程加锁的区别(Redis)

单线程多路复用和多线程加锁的区别

 

Deen 2015年11月21日提问linux

  • 关注 9 关注
  • 收藏 1 收藏,776 浏览

问题对人有帮助,内容完整,我也想知道答案0问题没有实际价值,缺乏关键内容,没有改进余地程序员

看介绍说redis是单线程的,经过epool实现多路复用。因为是单线程因此对资源的访问是串行的,不会产生资源竞争。而后忽然有个疑惑,既然对资源的访问是串行的,也就是说若是我某个请求要set,而前面排着K个一样要set的操做,我仍是得等它们set完成我再能set。而后有几点疑问,但愿大牛不吝赐教:golang

  • 经过多路复用单线程串行地访问资源和多线程并发访问而后给资源加互斥锁有什么区别呢?redis

  • 抛开线程建立的开销,二者的性能如何呢编程

  • golanggoroutine必定程度上减轻了线程建立的开销,高并发场景下多个goroutine访问资源时加互斥锁,和redis的单线程访问资源性能差别大吗segmentfault

  • golang没有epool的库,或者说有个goroutine+channel还须要epool多线程

查看所有 3 个回答

答案对人有帮助,有参考价值0答案没帮助,是错误的答案,答非所问并发

对于key/value并不长的状况,好比二三十个字节,redis在2.4ghz的机器跑个几万每秒的set没什么压力,因此你不用担忧说会等的状况,若是这个都还不够快,你该考虑加进程加机器。关于单线程多线程有什么区别的问题,这个只是编程模型的不一样,简单一点的场景,若是你的应用每台机器都本身独立部署,它的请求也都是来自本机,你用单线程多线程都OK,若是你想利用多核,那显然单线程是不够的,你须要跑多个实例,而后在它前面有一个服务来作请求分配,若是你是多线程,那么能够由一个线程来干这个活,就只须要一个服务就够了。关于性能,若是你都是干同样的活,而且你的线程数量并不太多,那性能上应该几无差别或者差别很小,这里影响的仍是吞吐。假设你的代码除了访问这块的模型差别外,其余地方都同样,那就取决于你这个竞争访问的粒度了,就是这个锁锁住的代码执行是不是耗时长的,锁并不慢,慢的是竞争,除非你每秒要作几十几百万次加解锁,理论上,若是你的粒度比较小,多线程的吞吐必定是大于单线程的,除非你的粒度很大,大到每个请求都串行处理了,这样就已经失去了多线程的意义。吞吐上去了,固然所使用的 cpu 天然也上去了,或者说使用了更多的 cpu 资源,吞吐上去了。memcached

ccwenlin90 声望高并发

推荐答案

答案对人有帮助,有参考价值0答案没帮助,是错误的答案,答非所问

采纳

来回答前同事的一部分问题

首先你要知道redis除了持久化,几乎全部操做都是在操做内存,好比像简单的set get操做都很是快,具体多快我以为你能够本身来作一个benchmark,并不难
若是你关注新闻的话能够知道双11阿里的交易巅峰值是14w笔/s
这基本已是国内it界最高的并发了(那种几亿同时在线的不算),你再去想一想操做内存的时间,不考虑事务,我只把14w条数据记下来看起来并非什么难事对不对

一台写不过来我十台总行了吧,因此除非你的set的value自己特别大,不用担忧在操做时的等待时间,就算有1w个请求过来,你仍是在操做内存,严格意义上说,redis自己应对的业务场景并非一个高并发的场景,你看一下redis自己默认的链接数设置应该也就懂了

应对这种场景,你用多线程+锁也没有什么问题(固然性能可能会差一点点),以前tim大神作过一个memcached和redis的性能对比,虽然年代久远,不过也能够说明一些问题,要知道memcached就是多线程+锁的模型,二者看起来差异也没有太过夸张。虽然结果是redis好一些。

看到这里你是否是以为单线程+io复用赢了?这可真不必定。。只是在这种场景下赢了而已,自己单线程io复用和多线程+锁其实只是两种编程模型,两种模型也都是为了解决问题,哪一种优要看具体的业务场景,这里仍是要说了,不服跑分啊

go的goroutine本质是green threads,runtime来调度的用户态线程,其实这种概念在其余语言里也有,只是其余语言都是以第三方库来作这件事情,go把它集成在了语言内,而且不用你本身去管理调度的事情,go语言里的实现只是让你能够更方便地写而已,因此这东西并非银弹,不用太过迷信,go所带来的更重要的是开发效率的提高,并无解决什么具体的问题。

关于epoll,go语言的net库底层也是用epoll来作io复用的(仅指linux平台),epoll这个东西只是linux下的一种io复用的实现,在其余的发行版里还有其余变种,而程序员们其实不太想关心你这些事情,他们但愿在linux下写的程序去freebsd还能跑,因此libevent棒棒哒,固然你写go的话,这些事情不用操心。

相关文章
相关标签/搜索