1.Token 机制:
a首先客户端请求服务端,获取一个 token,每一次请求都获取到一个全新的 token(当然这个 token 会有一个超时时间),将 token 存入 redis 中,然后将 token 返回给客户端。
b客户端将来携带刚刚返回的 token 去请求一个接口。
c服务端收到请求后,分为两种情况:
ⅰ如果 token 在 redis 中,直接删除该 token,然后继续处理业务请求。
ⅱ如果 token 不在 redis 中,说明 token 过期或者当前业务已经执行过了,那么此时就不执行业务逻辑。
d优势:实现简单。
e劣势:多了一个获取 token 的过程。
2.去重表(主要是利用 MySQL 的唯一索引机制来实现的)
a客户端请求服务端,服务端将这次的请求信息(请求地址、参数。。。)存入到一个 MySQL 去重表中,这个去重表要根据这次请求的某个特殊字段建立唯一索引或者主键索引。
b判断是否插入成功:
ⅰ成功:继续完成业务功能。
ⅱ失败:表示业务已经执行过了,这次就不执行业务了。
c存在的问题:MySQL 的容错性会影响业务、高并发环境可能效率低。
3.用 Redis 的 setnx
a客户端请求服务端,服务端将能代表本次请求唯一性的业务字段,通过 setnx 的方式存入 redis,并设置超时时间。
b判断 setnx 是否成功:
ⅰ成功:继续处理业务。
ⅱ失败:表示业务已经执行过了。
4.设置状态字段
○要处理的数据,有一个状态字段。
5.锁机制:
a 乐观锁:数据库中增加版本号字段,每次更新都根据版本号来判断。更新之前先去查询要更新记录的版本号,第二步更新的时候,将版本号也作为查询条件。
ⅰselect version from xxx where id=xxx;
ⅱupdate xxx set xxx=xxx where xx=xx and version=xxx。
b 悲观锁:
ⅰ 假设每一次拿数据都会被修改,所以直接上排他锁就行了。