处理幂等性的思路
Token 机制
- 首先客户端请求服务器,获取一个 token,每次请求获取一个全新的 token(token 具有超时时间),将 toekn 存入 redis 中,然后将 token 返回给客户端。
- 客户端使用 token 去请求接口
- 服务端收到请求后,分为两种情况:
- 如果 token 在 redis 中,删除 token,继续处理业务请求。
- 如果 token 不存在,说明 token 过期或当前业务已执行,则不执行业务。
优点:实现简单
缺点:多了一个获取 token 的过程
去重表
主要利用 MySQL 的唯一索引机制
- 客户端请求服务端,服务端将这次的请求信息(请求地址、参数。。。)存入到一个 MySQL 去重表中,根据请求的某个特殊字段建立唯一索引或主键索引。
- 判断是否插入成功
- 成功:继续完成业务功能
- 失败:表示业务已经执行,则不执行业务
- 存在的问题
- MySQL 的容错性会影响业务、高并发环境效率低
用 Redis 的 setnx
- 客户端请求服务端,服务端将能代表本次请求唯一性的业务字段,通过 setnx 的方式存入 redis,并设置超时时间。
- 判断 setnx 是否成功:
- 成功:继续处理业务
- 失败:表示业务已经执行过了
设置状态字段
处理的数据有一个状态字段
锁机制
乐观锁
数据库中增加版本号字段
更新都根据版本号来判断
悲观锁
直接上排它锁