【每日一道面试题】如何实现多次请求幂等

场景

有一个用户提现100元,他的余额只有 100,如何在用户多次点击提现按钮的情况下,实现幂等。

采用以下的方案进行结果(实质上以下流程并不是所有节点都需要,按实际需求进行选择):

  1. 用户点击提现按钮,前端向后端申请 Token。
  2. 后端生成 Token 并存入 Redis,返回给前端。
  3. 用户提交提现请求,携带 Token、金额和用户信息。
  4. 后端校验 Token的有效性,并拒绝无效的请求。
  5. 获取分布式锁,防止并发请求
  6. 插入提现流水记录,利用唯一索引拦截重复的请求
  7. 使用乐观锁更新用户余额,确保扣款安全。
  8. 事务提交后释放分布式锁,并缓存提现结果。
  9. 后续重复请求因 Token失效,流水记录冲突或缓存命中,直接返回首次结果。

详细步骤解释

1. 生成唯一提现票据(Token)

  • 实现逻辑:用户进入提现页面时,后端生成一个唯一 Token(如 UUID),存储到Redis 并设置较短的有效期(如5秒),同时返回给前端。每次提现请求必须携带此 Token。
    提现接口需校验请求中的Token 是否存在且有效。若 Token 不存在或已无效,直接返回“重复请求” 错误。
  • 示例代码
// 伪代码:校验 Token
String token = request
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值