單線程多路複用和多線程加鎖的區別(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的話,這些事情不用操心。

相關文章
相關標籤/搜索