編程思想之冪等性 | 編程之道

前言

今年年初遇到項目災(zāi)難,解決了不少問題拴鸵,這是其中一個問題。很早的時候?qū)懙奈仙Γ瑢W(xué)以致用的劲藐。今天看到還有這樣一篇稿文,那就整理下分享給大家學(xué)習(xí)樟凄!編程思想之冪等性


什么是冪等性
既然冪等性源于數(shù)學(xué)聘芜,那我就使用數(shù)學(xué)公式來表示,即可一目了然缝龄!

f(f(x)) = f(x)

顯然汰现,從上面的二元函數(shù)可以看出挂谍,無論x(等冪元素)被函數(shù)y無限地執(zhí)行運算,它的結(jié)果都是相同的瞎饲。在計算機編程領(lǐng)域中口叙,我們可以這么定義冪等性:在調(diào)用某個方法、接口中嗅战,我們使用相同的參數(shù)(相同的特定參數(shù))妄田,其返回值都是相同的,我們便可稱方法驮捍、接口具有冪等性疟呐。從信仰上說,冪等性是一種承諾东且,只要一次答應(yīng)某個承諾萨醒,其承諾內(nèi)容都是不會改變的。

Methods can also have the property of “idempotence” in that (aside from error or expiration issues) the side-effects of N > 0 identical requests is the same as for a single request.

如何理解冪等性
理解性的理論苇倡,舉例子掌握最快富纸。

  • 無心舉例,看場景更易理解旨椒。哈哈

冪等性場景設(shè)計

下單處理

這個例子曾經(jīng)出現(xiàn)在我的身邊:微信服務(wù)端在搞事情晓褪!
客戶端提交數(shù)據(jù)超過十秒后,他會定時在十秒后自行斷開并自動再次發(fā)起請求综慎,請求的數(shù)據(jù)體一模一樣涣仿,但是這樣的請求是不合法的,屬重復(fù)請求示惊。如何解決此事呢好港?可以使用冪等性作為一個良好的解決方案。為解決此問題米罚,在此先謝謝騰訊大佬CC,后會無期钧汹!

原本的方法是這樣設(shè)計的

function add($userToken, $orderMessage){
  //todo
}

這樣處理那就不能規(guī)避重復(fù)請求了。

基于冪等性來解決此問題录择,改進的設(shè)計方法

function add($seq,$userToken, $orderMessage){
  // 現(xiàn)根據(jù)seq來判斷是否已經(jīng)處理過了拔莱,是的話就返回第一次處理的結(jié)果
  $resultJson = $this->redis->get('***_pre_' . $seq);
  if(false != $resultJson){
    return $resultJson;
  }
  // 既然沒有處理過,那就正式處理
  // todo 
  // 處理完了隘竭,沒有問題那就將結(jié)果保存起來
  // todo
  return $resultJson;
}

冪等性屬于解決此問題的一部分塘秦,是解決方案的一部分,還有另一部分是異步动看。


提現(xiàn)
基于冪等性設(shè)計 | 防止用戶多次點擊(后端是不相信前端處理的)或者突然網(wǎng)絡(luò)異常等情況下尊剔,可以保持數(shù)據(jù)的一致性。

兩個步驟:

  • 后端生產(chǎn)票據(jù) | 生產(chǎn)隊時給你發(fā)糧票菱皆,你才有機會拿錢去購買柴米油鹽醬醋茶
  • 根據(jù)上一步拿到合法的票據(jù)來提現(xiàn)
function createTicketSequence($user) : string{
  // todo 
}
function withdraw($ticketSequence,$user,$amount){
  // todo
}

場景理解
1须误、用戶在取款的時候笔咽,客戶端先帶上token請求服務(wù)端生成一個合法的取款憑證ticketSequeuence
2、用戶在輸入取款金額并確認取款后霹期,客戶端將會帶上用戶登錄憑證userToken叶组、取款票據(jù)ticketSequence以及取款金額amount進行請求
3、服務(wù)端接收到請求后历造,先校驗userToken甩十,校驗失敗則返回重新登錄,否則換取user對象
4吭产、用戶鑒權(quán)通過后侣监,那么再來校驗取款票據(jù)ticketSequence,票據(jù)不合法臣淤,那么取款失敗橄霉,否則繼續(xù)進行取款,一直到取款成功并根據(jù)票據(jù)作為冪等值來保存提現(xiàn)成功的結(jié)果
5邑蒋、即使客戶端請求后與服務(wù)端失去了聯(lián)系姓蜂,并且服務(wù)端處理成功,客戶端處于假死的狀態(tài)并再次請求取款医吊,也是返回第一次的結(jié)果钱慢,并且是迅速的響應(yīng)。

價值源于技術(shù)卿堂,技術(shù)源于分享!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末束莫,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子草描,更是在濱河造成了極大的恐慌览绿,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件穗慕,死亡現(xiàn)場離奇詭異饿敲,居然都是意外死亡,警方通過查閱死者的電腦和手機揍诽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門诀蓉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來栗竖,“玉大人暑脆,你說我怎么就攤上這事『” “怎么了添吗?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長份名。 經(jīng)常有香客問我碟联,道長妓美,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任鲤孵,我火速辦了婚禮壶栋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘普监。我一直安慰自己贵试,他們只是感情好,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布凯正。 她就那樣靜靜地躺著毙玻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪廊散。 梳的紋絲不亂的頭發(fā)上桑滩,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機與錄音允睹,去河邊找鬼运准。 笑死,一個胖子當著我的面吹牛缭受,可吹牛的內(nèi)容都是我干的戳吝。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼贯涎,長吁一口氣:“原來是場噩夢啊……” “哼听哭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起塘雳,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤陆盘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后败明,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體隘马,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年妻顶,在試婚紗的時候發(fā)現(xiàn)自己被綠了酸员。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡讳嘱,死狀恐怖幔嗦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情沥潭,我是刑警寧澤邀泉,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響汇恤,放射性物質(zhì)發(fā)生泄漏庞钢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一因谎、第九天 我趴在偏房一處隱蔽的房頂上張望基括。 院中可真熱鬧,春花似錦财岔、人聲如沸阱穗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽揪阶。三九已至,卻和暖如春患朱,著一層夾襖步出監(jiān)牢的瞬間鲁僚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工裁厅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留冰沙,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓执虹,卻偏偏與公主長得像拓挥,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子袋励,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容