接口的冪等性的N種考慮,你知道嗎?
往期熱門文章:
2、如果程序員和產(chǎn)品經(jīng)理都用凡爾賽文學(xué)對話......
3、Spring Boot 2.4.0正式發(fā)布,全新的配置文件加載機制(不向下兼容)
目錄
目錄 前言 正文 1 接口冪等性 1.1 案例 2 解決方案 2.1 token機制 2.2 去重表 2.3 redis 的 SETNX鍵值 2.4 狀態(tài)機冪 2.5 樂觀鎖(更新操作) 2.6 悲觀鎖(更新操作) 結(jié)語
前言
正文
1 接口冪等性
1.1 案例
2 解決方案
2.1 token機制
首先客戶端先請求服務(wù)端,服務(wù)端生成token,每次請求生成的都是一個新的token(這個token一定要設(shè)置超時時間),將token存入redis當(dāng)中,然后將token返回給客戶端。 客戶端攜帶剛剛返回的token請求服務(wù)端做業(yè)務(wù)請求。 服務(wù)端收到請求,做判斷。 如果token在redis中,則直接刪除該token,然后繼續(xù)做業(yè)務(wù)請求。 如果token不在redis中,代表已經(jīng)執(zhí)行過當(dāng)前業(yè)務(wù)了,則不執(zhí)行業(yè)務(wù)。
2.2 去重表
首先客戶端先請求服務(wù)端,服務(wù)端先將這次的請求信息存入一張mysql的去重表中,這張表要根據(jù)這次請求的其中某個特殊字段建立唯一索引,或者主鍵索引。 判斷是否插入成功 如果插入成功,則繼續(xù)做后續(xù)業(yè)務(wù)請求。 如果插入失敗,則代表已經(jīng)執(zhí)行過當(dāng)前請求。
1.mysql容錯性,也就是mysql本身如果不是高可用的那么業(yè)務(wù)可能會受到影響: 2.既然是唯一索引,自然在寫表的時候就沒有辦法用到changbuffer,每次都要從磁盤查出來判斷再寫入,對于一個高并發(fā)的接口來說,這些都是需要考慮的因素。
2.3 redis 的 SETNX鍵值
首先客戶端先請求服務(wù)端,服務(wù)端將能代表這次請求業(yè)務(wù)的唯一字段以 SETNX 的方式存入redis,并設(shè)置超時時間,超時時間可以根據(jù)業(yè)務(wù)權(quán)衡。 判斷是否插入成功 如果插入成功,則繼續(xù)做后續(xù)業(yè)務(wù)請求。 如果插入失敗,則代表已經(jīng)執(zhí)行過當(dāng)前請求。
2.4 狀態(tài)機冪
2.5 樂觀鎖(更新操作)
首先客戶端先請求服務(wù)端,先查詢出當(dāng)前的version版本。 select version from .. where .. 根據(jù)version版本來做sql操作 UPDATE .. SET ... version=(version+1) WHERE .. AND version=version;
2.6 悲觀鎖(更新操作)
START?TRANSACTION;?#?開啟事務(wù)
SELETE?*?FROM?TABLE?WHERE?..?FOR?UPDATE;
UPDATE?TABLE?SET?...?WHERE?..;
COMMIT;?#?提交事務(wù)
結(jié)語
往期熱門文章:
1、《歷史文章分類導(dǎo)讀列表!精選優(yōu)秀博文都在這里了!》
2、你以為JDK8之后用HashMap就沒事了?死循環(huán)問題依然存在! 3、14 個 Spring MVC 頂級技巧,隨時用隨時爽,一直用一直爽 4、交公糧了:十一在家我都逛了哪些技術(shù)網(wǎng)站? 5、高并發(fā)和海量數(shù)據(jù)下的 9 個 Redis 經(jīng)典案例剖析! 6、Docker 禁止被列入美國“實體名單”的國家、企業(yè)、個人使用
7、日志框架到底是Logback 還是 Log4j2? 8、IDEA 2020.2 重磅發(fā)布,動畫級新功能預(yù)覽! 9、數(shù)據(jù)庫鏈接池終于搞對了,這次直接從100ms優(yōu)化到3ms! 10、互聯(lián)網(wǎng)公司忽悠員工的黑話,套路太深了。。。
評論
圖片
表情
