1、概念
冪等性, 通俗的說就是一個接口, 多次發起同一個請求, 必須保證操作只能執行一次
比如:
訂單接口, 不能多次創建訂單
支付接口, 重復支付同一筆訂單只能扣一次錢
支付寶回調接口, 可能會多次回調, 必須處理重復回調
普通表單提交接口, 因為網絡超時等原因多次點擊提交, 只能成功一次
等等
2、常用解決方案
唯一索引,防止新增臟數據
token機制,防止頁面重復提交
悲觀鎖,獲取數據的時候加鎖(鎖表或鎖行)
樂觀鎖,基於版本號version實現, 在更新數據那一刻校驗數據
分布式鎖, redis(jedis、redisson)或zookeeper實現
狀態機,狀態變更, 更新數據時判斷狀態
3、實現思路
為需要保證冪等性的每一次請求創建一個唯一標識token, 先獲取token, 並將此token存入redis, 請求接口時, 將此token放到header或者作為請求參數請求接口, 后端接口判斷redis中是否存在此token:
如果存在, 正常處理業務邏輯, 並從redis中刪除此token, 那么, 如果是重復請求, 由於token已被刪除, 則不能通過校驗, 返回請勿重復操作提示。
如果不存在, 說明參數不合法或者是重復請求, 返回提示即可。
4、代碼實現
(1)redis工具類
(2)冪等性的接口自定義注解
(3)冪等性攔截器方法
(4)service方法
本文轉自:https://blog.csdn.net/zhenwei1994/article/details/94359724