处理幂等性的思路

Token 机制

  1. 首先客户端请求服务器,获取一个 token,每次请求获取一个全新的 token(token 具有超时时间),将 toekn 存入 redis 中,然后将 token 返回给客户端。
  2. 客户端使用 token 去请求接口
  3. 服务端收到请求后,分为两种情况:
    1. 如果 token 在 redis 中,删除 token,继续处理业务请求。
    2. 如果 token 不存在,说明 token 过期或当前业务已执行,则不执行业务。

优点:实现简单

缺点:多了一个获取 token 的过程

去重表

主要利用 MySQL 的唯一索引机制

  1. 客户端请求服务端,服务端将这次的请求信息(请求地址、参数。。。)存入到一个 MySQL 去重表中,根据请求的某个特殊字段建立唯一索引或主键索引。
  2. 判断是否插入成功
    • 成功:继续完成业务功能
    • 失败:表示业务已经执行,则不执行业务
  3. 存在的问题
    • MySQL 的容错性会影响业务、高并发环境效率低

用 Redis 的 setnx

  1. 客户端请求服务端,服务端将能代表本次请求唯一性的业务字段,通过 setnx 的方式存入 redis,并设置超时时间。
  2. 判断 setnx 是否成功:
    • 成功:继续处理业务
    • 失败:表示业务已经执行过了

设置状态字段

处理的数据有一个状态字段

锁机制

  1. 乐观锁

    数据库中增加版本号字段

    更新都根据版本号来判断

  2. 悲观锁

    直接上排它锁