是在一次比较偶然的情况下,可能是页面卡顿或者网络延迟,发生了重复提交事件,原因是:按钮的loading效果没出来。 经过了优化,或者是给按钮加disable,是可以解决这个问题的。
上面都是前端页面防止重复提交的解决方法。
但是,可能有比较极端的情况下,前端没check住重复提交。那后端呢,用什么办法来防止。
可以利用缓存,以redis为例,key可以根据实际业务命名。
一、set缓存
1. setIfAbsent(key, value),如果返回true,可以继续执行。执行完,del(key)。
2. setIfAbsent(key, value),如果返回false,报错“不能重复提交”。
二、缓存计数器
long count = increment(key, 1);
if (count == 1) {
//执行后续代码。执行完,del(key)。
}
if (count > 1) {
//报错“不能重复提交”。
}
除此之外, 缓存计数器还可以用在很多场景下,比如:
1. 1分钟不能给重复手机号发多次短信:
expire(key, 60, TimeUnit.SECONDS); //设置有效期一分钟
2. 1天只能发100条短信
expire(key, 1, TimeUnit.DAYS); //设置有效期一天
重要一点,Redis incr 操作具有原子性,所以不用担心并发问题。