前言:
幂等性指的是多次操作,结果是一致的,其任意多次执行所产生的影响均与一次执行的影响相同,例如我们多个线程去查询数据库,多次操作数据库数据要保证一致。现在企业级的事项目大部分都是分布式的,而在分布式环境下幂等是非常常见也是我们必须要解决的问题;
常见的幂等解决方案:
- 唯一键索引
- 分布式锁 (redis(jedis、redisson)或zookeeper实现)
- tonken机制 (流水号,防止页面重复提交)
- 悲观锁(获取数据的时候加锁(锁表或锁行))
- 乐观锁 (基于版本号version实现, 在更新数据那一刻校验数据)
- 状态机 (状态变更, 更新数据时判断状态)
我们今天主要说一个代码层面通过注解的形式来实现一个通用幂等组件
其大体流程如下图:
设计注解(ElementType.METHOD方法层面): (默认值expireTime为过期时间也就是一定时间内要求 当前用户当前任务只能执行一次)
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPo