思路以下:redis
一、自定義註解 @NoRepeatSubmit 標記有必要防重複提交請求Controller。併發
二、經過Spring-AOP方式對全部標記了 @NoRepeatSubmit 的方法進行切入攔截。分佈式
三、在業務方法執行前,獲取當前用戶的 token+ 當前請求地址,做爲一個惟一 KEY,去獲取 Redis 分佈式鎖(若是此時併發獲取,只有一個線程會被成功獲取到鎖)。測試
四、業務方法執行後,必定要釋放鎖,異常也要釋放鎖(放到finally中釋放亦可)。線程
經過上面測試,咱們看到初始化十個線程,只有一個線程是提交成功了。blog
若是是分佈式項目能夠使用基於redis的分佈式鎖,token
若是是單機項目能夠使用AtomicInteger或者更高效的併發計數器LongAdder實現單機鎖.it