日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
面試官扎心一問:防止重復(fù)請求提交,有什么方案?

 本文轉(zhuǎn)載自微信公眾號「UP技術(shù)控」,作者 conan5566。轉(zhuǎn)載本文請聯(lián)系UP技術(shù)控公眾號。 conan5566  

成都創(chuàng)新互聯(lián)公司作為成都網(wǎng)站建設(shè)公司,專注重慶網(wǎng)站建設(shè)公司、網(wǎng)站設(shè)計(jì),有關(guān)成都定制網(wǎng)站方案、改版、費(fèi)用等問題,行業(yè)涉及崗?fù)?/a>等多個(gè)領(lǐng)域,已為上千家企業(yè)服務(wù),得到了客戶的尊重與認(rèn)可。

背景

在平常開發(fā)中,我們經(jīng)常會面對防止重復(fù)請求的問題。當(dāng)服務(wù)端對于請求的響應(yīng)涉及數(shù)據(jù)的修改,或狀態(tài)的變更時(shí),可能會造成極大的危害。重復(fù)請求的后果在交易系統(tǒng)、售后維權(quán),以及支付系統(tǒng)中尤其嚴(yán)重。但是很多時(shí)候,都是指望著前端來限制,比如提交之后,按鈕diseabled之類的,其實(shí)這些都是不靠譜的。關(guān)鍵時(shí)候還是需要后端來校驗(yàn)。

解決方式

1、基于緩存數(shù)據(jù)狀態(tài)的驗(yàn)證

Redis存儲查詢輕量快速。在request進(jìn)來的時(shí)候,可以先記錄在緩存中。后續(xù)進(jìn)來的request每次進(jìn)行驗(yàn)證。整個(gè)流程處理完成,清除緩存。

 
 
 
  1. if (!CacheExtension.getInstance().AddUnique($"{key}_unique", 1, DateTimeOffset.Now.AddDays(365))) 
  2.             { 
  3.                 LogExtention.getInstance().WriteCustomLogAsync("", "", true, "上批次還未執(zhí)行結(jié)束"); 
  4.                 return ResponseResult.FromError("上批次還未執(zhí)行結(jié)束!"); 
  5.             } 
 
 
 
  1. if (!string.IsNullOrEmpty(uniqueKey)) 
  2.             { 
  3.                 CacheExtension.getInstance().Remove(uniqueKey); 
  4.             } 
  5.             return ResponseResult.Ok(); 

2、利用唯一索引機(jī)制的驗(yàn)證

需要原子性操作,想到了數(shù)據(jù)庫的唯一索引。新建一個(gè)表,每次request進(jìn)來則往表里面插入數(shù)據(jù), 操作完成后,刪除此條記錄。

3、基于緩存的計(jì)數(shù)器驗(yàn)證

由于數(shù)據(jù)庫的操作比較消耗性能,了解到redis的計(jì)數(shù)器也是原子性操作。果斷采用計(jì)數(shù)器。既可以提高性能,還不用存儲,而且能提升qps的峰值。 每次request進(jìn)來則新建一個(gè)以orderId為key的計(jì)數(shù)器,然后+1。如果>1(不能獲得鎖): 說明有操作在進(jìn)行,刪除。如果=1(獲得鎖): 可以操作。

 
 
 
  1. redis> SET test 20 
  2. OK 
  3. redis> INCR test 
  4. (integer) 21 
  5. redis> GET test # 數(shù)字值在 Redis 中以字符串的形式保存 
  6. "21" 
  7.  
  8. //獲取指定的所有計(jì)數(shù)器 
  9. HGETALL counter:user:{userID}    
  10.  
  11. //獲取指定的指定計(jì)數(shù)器 
  12. HMGET counter:user:{userID}  praiseCnt hostCnt  
  13.  
  14. //指定點(diǎn)贊數(shù)+1 
  15. HINCRBY counter:user:{userID}   praiseCnt 

總結(jié)

1、c#本身有l(wèi)ock機(jī)制,單體模式可以使用。

2、但是考慮到我們的分布式部署,建議還是用緩存。在大并發(fā)的情況下,程序各種情況的發(fā)生。特別是涉及到金額操作。所以在大并發(fā)要互斥的情況下可以考慮2、3兩種方案。


標(biāo)題名稱:面試官扎心一問:防止重復(fù)請求提交,有什么方案?
本文網(wǎng)址:
http://m.5511xx.com/article/cdschpj.html