StackExchange.Redis 官方文檔(六) PipelinesMultiplexers

流水線和復用

糟糕的時間浪費。現代的計算機以驚人的速度產生大量的數據,而且高速網絡通道(通常在重要的服務器之間同時存在多個鏈路)提供了很高的帶寬,但是計算機花費了大量的時間在 等待數據 上面,這也是造成使用持久性鏈接的編程方式越來越流行的原因之一。常規的編碼方式:

string a = db.StringGet("a");
string b = db.StringGet("b");

就步驟而言,它看起來像下面這樣:

[req1]                         # client: the client library constructs request 1[c=>s]                    # network: request one is sent to the server[server]             # server: the server processes request 1[s=>c]        # network: response one is sent back to the client[resp1]  # client: the client library parses response 1[req2][c=>s][server][s=>c][resp2]

高亮 client 端正在做的事情:

[req1][====waiting=====][resp1][req2][====waiting=====][resp2]

如果按照時間縮放的話,就會看到大部分的時間都耗在了 等待 上面。

Pipelining

由于上述的原因,很多 redis 客戶端允許使用 pipelining; 這是一種可以一次性通過管道發送多條消息的方式而不用一條一條的發送等.待,而且可以在等到回復時一并處理他們. .NET 的異步方法。

舉例來說

var aPending = db.StringGetAsync("a");
var bPending = db.StringGetAsync("b");
var a = db.Wait(aPending);
var b = db.Wait(bPending);

在這里使用 db.Wait 可以自動采用配置的超時時間, 但也可以使用 aPending.Wait() 或者 Task.WaitAll(aPending, bPending);的方式,根據你自己的喜好來. 這樣一來 20 個請求可能合并為一個請求。

Fire and Forget

pipelining 的一種特殊場景是,我們并不關心某個操作的返回結果,這樣的話我們的代碼可以馬上接著往下執行,而那個放入到隊列中的操作將會在后臺執行. 通常來說,這意味我們可以把并行的操作放到一個單獨的 caller 的連接上執行. 這種情況下, 我們可以使用 flags 參數達到這樣的目的.

// sliding expiration
db.KeyExpire(key, TimeSpan.FromMinutes(5), flags: CommandFlags.FireAndForget);
var value = (string)db.StringGet(key);

FireAndForget 標志使得client library 正常的把要做的事情的排成隊列, 但是會馬上返回一個默認的值,這個默認值沒有任何的實用意義. 這也適用于 *Async 方法:會返回一個已經完成的 Task<T>.

Multiplexing 多路復用

pipelining 已經很好了,但是很多情況下一個代碼塊只需要一個單獨的值 (或許這個代碼塊希望執行一些簡單的操作,但是這些操作是相互依賴的). 這也就是說我們仍然會消耗大量的時間在client和server之間交互等待. 假如有一個業務繁忙的應用, 或許是一個網站服務器. 這些應用往往都是并發的, 所以如果有20個并行的應用請求數據,你可能采用建立20個鏈接的方式,或者異步使用同一個鏈接(最后一個請求需要等之前19個完成). 或者做個讓步, 使用一個擁有5個鏈接的程序池 - 但是不管你怎么做,都會有大量的等待發生。StackExchange.Redis 沒有做以上的事情 它只是盡可能的充分復用一個鏈接. 當被不同的調用者同時調用時,它會 自動地將不同的請求放到隊列中, 所以無論請求使用同步或者異步的方式,要做的事情都會放到隊列中. 所以我們可能有10個或者20個 "get a and b" 的場景,他們都會盡快的獲取鏈接執行命令.

鑒于以上的原因,StackExchange.Redis 沒有( 將來也不會 )提供 "blocking pops" (BLPOP, BRPOP and BRPOPLPUSH). 因為這會使得一個單獨的調用者減慢整個的多路復用環境,堵塞其他所有的調用者. 唯一的例外 StackExchange.Redis 需要驗證事務的先決條件時需要保證工作的時間. 這也是StackExchange.Redis 將這些條件包裝在 Condition 的實例中. Read more about transactions here, 如果真的想用 "blocking pops", 這里墻裂建議你使用pub/sub的方式替代.

sub.Subscribe(channel, delegate {string work = db.ListRightPop(key);if (work != null) Process(work);
});
//...
db.ListLeftPush(key, newWork, flags: CommandFlags.FireAndForget);
sub.Publish(channel, "");

這實現了相同的目的,而不需要阻塞操作:

  • data 沒有通過 pub/sub 的方式發送; pub/sub 只是用來通知worker去檢查隊列是否有數據
  • 如果沒有worker,新的item 會存在list里面; 這項工作也不算是完全失敗
  • 一個worker 只能 pop 一個值; 就算有很多的 consumer 消費這個隊列,其中的一些 consumer 被通知到也拿不到值去做接下來的事情
  • 當你重啟一個worker時,你應該假定隊列中有 work 這樣可以消費積壓的work
  • 但除此之外,語義與 blocking pops相同

StackExchange.Redis的復用特性使得使用普通的簡單代碼時,在一個連接上達到極高的吞吐量成為可能。.

Concurrency

pipeline / multiplexer / future-value 只會在 continuation-based 的異步代碼上起到較好的作用

string value = await db.StringGetAsync(key);
if (value == null) {value = await ComputeValueFromDatabase(...);db.StringSet(key, value, flags: CommandFlags.FireAndForget);
}
return value;

轉發請標注本文鏈接地址:(https://www.cnblogs.com/ArvinZhao/p/6825870.html)

轉載于:https://www.cnblogs.com/ArvinZhao/p/6825870.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/450259.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450259.shtml
英文地址,請注明出處:http://en.pswp.cn/news/450259.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

開發優秀產品的六大秘訣

摘要&#xff1a;本文是Totango的聯合創始人兼公司CEO Guy Nirpaz發表在Mashable.com上的文章。無論是在哪個行業&#xff0c;用戶永遠是一款產品的中心&#xff0c;本文作者就以用戶為中心&#xff0c;為大家講述了六個如何為企業產品添加功能的秘訣。 隨著云計算的發展&#…

Spring Boot下無法加載主類 org.apache.maven.wrapper.MavenWrapperMain問題解決

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 引言&#xff1a; 在SpringBoot中需要使用mvnw來做相關操作&#xff0c;但是卻有時候會報出達不到MavenWrapperMain的錯誤信息&#xff…

【前端面試】字節跳動2019校招面經 - 前端開發崗(二)

【前端面試】字節跳動2019校招面經 - 前端開發崗&#xff08;二&#xff09; 因為之前的一篇篇幅有限&#xff0c;太長了看著也不舒服&#xff0c;所以還是另起一篇吧?一、 jQuery和Vue的區別 jQuery 輕量級Javascript庫Vue 漸進式Javascript-MVVM框架jQuery和Vue的對比 jQuer…

SpringBoot與SpringCloud的版本說明及對應關系

轉載原文地址&#xff1a;https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E

leetcode 8: 字符串轉整數(atoi)

實現 atoi&#xff0c;將字符串轉為整數。 該函數首先根據需要丟棄任意多的空格字符&#xff0c;直到找到第一個非空格字符為止。如果第一個非空字符是正號或負號&#xff0c;選取該符號&#xff0c;并將其與后面盡可能多的連續的數字組合起來&#xff0c;這部分字符即為整數的…

優秀產品頁設計:將訪問者轉化成客戶

摘要&#xff1a;本文是對外文《 Better Product Pages: Turn Visitors Into Customers 》的翻譯&#xff0c;編譯內容如下&#xff1a; 展示產品、服務的方法是其獲得成功的關鍵。在Web上&#xff0c;你留給用戶的第一印象是至關重要的。 如果有人訪問你的網站&#xff0c;一定…

計算機網絡學習方法

原文見&#xff1a;http://blog.csdn.net/qq_33506160/article/details/51872708 一、網絡課程究竟難在哪&#xff1f; 1&#xff0e;內容比較亂 如果把《計算機網絡技術基礎》看做是一本計算機網絡導論方面的教材&#xff0c;就不會認為亂了&#xff0c;因為導論就是為了解決知…

小程序類似抖音視頻整屏切換

更新 現在已經更新了github地址和效果gif&#xff0c;可在文章最后查看。如果我的代碼對你有用&#xff0c;請幫我隨手star一下。 需求 最近在項目中需要加一個功能&#xff0c;在小程序中將已有的短視頻功能&#xff0c;按照抖音的方式來瀏覽&#xff0c;整屏&#xff0c;可上…

Coding For Fun 32小時:充滿創造、激情、團結的編程馬拉松

摘要&#xff1a;Coding for Fun大賽是2012中國軟件開發者大會&#xff08;SDCC&#xff09;的重要環節。由六名黑馬學員組成的“天翼二隊”&#xff0c;經過32小時的“血拼”&#xff0c;憑大賽作品“語音控”&#xff0c;獲得了本次大賽的“最佳設計獎”。本文是該隊隊員的參…

centos6.8安裝oracle12C 詳細步驟講解

2019獨角獸企業重金招聘Python工程師標準>>> centos6.8安裝oracle12C 詳細步驟講解 安裝前環境配置 1 root身份安裝依賴包 [rootdlp ~]# yum -y install binutils compat-libcap1 compat-libstdc-33 compat-libstdc-33.i686 gcc gcc-c glibc glibc.i686 glibc-deve…

解決 springboot 項目:找不到或無法加載主類

Spring Boot下無法加載主類 前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 我什么也沒有改&#xff0c;啟動服務報錯如題&#xff1a;找不到或無法加載主類 解決&#xff1a;什么也不…

管理好你的愿望,人生將另一個樣

別讓欲望控制了你欲望是人的本性。人生在世&#xff0c;誰都會有欲望。物欲、食欲、情欲、發財欲、求知欲……欲望是消防隊也無法撲滅的火。作為人&#xff0c;我們不能消除欲望&#xff0c;也不能讓欲望漫無邊際地增長&#xff0c;所以&#xff0c;我們應該把握好欲望的尺度&a…

25 模塊和包

今日內容 import from xxx import xxxx 金庸 1. 導入模塊的執行的步驟 2. 自定義模塊 3. 自定義包(難點) 一個表達式 -> 一條語句 -> 語句塊 -> 函數 -> 類 -> 模塊 -> 包 -> 項目 包就是我們的文件夾, 包內可以寫很…

【許曉笛】 EOS 智能合約案例解析(2)

詳解 EOS 智能合約的 cpp 文件 之前的文章介紹了 eosio.token 智能合約的 hpp 文件&#xff0c;這次向大家介紹 eosio.token.cpp 文件&#xff0c;cpp 文件即 C 代碼文件&#xff0c;智能合約所有的業務邏輯內容都是在 cpp 文件中實現的。 eosio.token.cpp 文件地址&#xff1a…

java 中 transient關鍵字

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 java語言的關鍵字&#xff0c;變量修飾符&#xff0c;如果用transient聲明一個實例變量&#xff0c;當對象存儲時&#xff0c;它的值不需…

java中int轉成String位數不足前面補零

java中int轉成String位數不足前面補零 轉載自&#xff1a;http://ych0108.iteye.com/blog/2174134java中int轉String位數不夠前面補零 String.format("%010d", 25); //25為int型 10代表前面要補的字符 10代表字符串長度 d表示參數為整數類型 今天想將int 轉String 位…

Oops! the requested resource is not found!

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 情況一&#xff1a;調用 dubbo 服務失敗&#xff0c;報錯如題&#xff1a;Oops! the requested resource is not found! 原因很簡單&am…

django URL路由基礎

URL是Web服務的入口&#xff0c;用戶通過瀏覽器發送過來的任何請求&#xff0c;都是發送到一個指定的URL地址&#xff0c;然后被響應。 在Django項目中編寫路由&#xff0c;就是向外暴露我們接收哪些URL的請求&#xff0c;除此之外的任何URL都不被處理&#xff0c;也沒有返回。…

Linux在超級計算機領域一統天下

摘要&#xff1a;在世界超級計算機排行榜500強榜單中&#xff0c;基于Linux的超級計算機占據了462個席位&#xff0c;比率高達92%。基于Windows的超級計算機僅有2個席位&#xff0c;份額為0.4%。中國基于Windows的超級計算機Magic Cube排名94位&#xff0c;澳大利亞基于Windows…

Qtum量子鏈漏洞賞金計劃正式開啟

本次Qtum量子鏈賞金計劃為了更好的借助社區的力量參與到QTUM主網及周邊應用的開發建設中&#xff0c;讓QTUM持續地保持安全、高效的運行&#xff0c;同時能滿足更多用戶的需求。Bug分級與獎勵體系1、如果已經有類似的Issue或者Qtum團隊已經知道并在解決該問題的情況將不適用于該…