使用redis实现接口幂等性

1、概念

幂等性, 通俗的说就是一个接口, 多次发起同一个请求, 必须保证操作只能执行一次

比如:

订单接口, 不能多次创建订单

支付接口, 重复支付同一笔订单只能扣一次钱

支付宝回调接口, 可能会多次回调, 必须处理重复回调

普通表单提交接口, 因为网络超时等原因多次点击提交, 只能成功一次

等等

2、常用解决方案

唯一索引,防止新增脏数据

token机制,防止页面重复提交

悲观锁,获取数据的时候加锁(锁表或锁行)

乐观锁,基于版本号version实现, 在更新数据那一刻校验数据

分布式锁, redis(jedis、redisson)或zookeeper实现

状态机,状态变更, 更新数据时判断状态

3、实现思路

为需要保证幂等性的每一次请求创建一个唯一标识token, 先获取token, 并将此token存入redis, 请求接口时, 将此token放到header或者作为请求参数请求接口, 后端接口判断redis中是否存在此token:

如果存在, 正常处理业务逻辑, 并从redis中删除此token, 那么, 如果是重复请求, 由于token已被删除, 则不能通过校验, 返回请勿重复操作提示。

如果不存在, 说明参数不合法或者是重复请求, 返回提示即可。

4、代码实现

(1)redis工具类

使用redis实现接口幂等性_第1张图片

(2)幂等性的接口自定义注解

使用redis实现接口幂等性_第2张图片

(3)幂等性拦截器方法

使用redis实现接口幂等性_第3张图片

(4)service方法

 

使用redis实现接口幂等性_第4张图片

 

 

你可能感兴趣的:(java编程模式与思想)