接口幂等性
什么是接口幂等性?
简而言之即是 f(f(x))=f(x),一次执行的结果和多次执行的结果完全一致
最简单想到的实现接口幂等性(重复提交)的操作是什么?
1. 前端按钮置灰
发起请求时置灰,等接口响应成功后恢复,可以屏蔽一大半小白用户
2. 锁
同步锁synchronized这是最易想起的东西了,synchronized是锁住某个变量或者某个方法或者是某个代码块,来保证解决多线程访问临界区造成的数据安全问题。synchronized锁的是什么呢?它锁住的是一个实例对象,假如每个线程都会重新产生新的实例对象,它只能锁住单个线程,若系统存在负载均衡或者Spring管理的Bean,那么同步锁就不起作用了
3. 分布式锁(Redis)
利用setnx实现,在set之前若存在则不set,否则则set,即是先占位的拿到锁,等这个key过期或者删除了释放锁。但是采用redis来做分布式锁,若过期时间没有得到控制,还得考虑redis挂掉了怎么处理,还要解锁,最终会演变成死锁等问题
最简单稍靠谱的解决方案是什么?
利用数据库的唯一约束解决
public void save(String 某个字段1,String 某个字段2){
try{
insert(某个字段1,某个字段2);
}catch (Exception e){
e.printStackTrace();
throw new Exception ("已存在!");
}
}
对参数设置unique约束,若存在则抛异常