接口的幂等性

客户端对于某一个资源的多次请求,操作结果应当是相同的,这就叫幂等性。

 

发起查询的请求并不会对数据进行增删改,所以查询请求是天然具备幂等性的。

 

实现方法:

在表中新增一个状态字段,处理请求时,先判断该状态是否为“已完成”,如果是,则直接返回成功,如果不是,则正常处理请求并修改状态为“已完成”。

 

此方法在串行的情况下没什么问题,但是在高并发下,则没办法保证操作的原子性,会出现首次请求还未来得及修改状态,第二次请求就已经开始处理的情况,所以需要通过加锁的方式来将其改为串行操作。

 

1.乐观锁

如果是数据更新操作,则可直接使用乐观锁来实现,最直接的方法则是新增一个 version 字段来实现:UPDATE table1 SET value=1,version=version+1 WHERE version=#version

 

2.去重表

使用数据ID(或其他在多次请求中能够保证相同的字段)作为唯一索引字段,在请求时插入到去重表中,当请求操作完成后,无论操作成功与否,删除去重表中的数据。途中额外的请求会因为表中唯一索引而插入失败。

 

3.分布式锁

如 Redis setnx 命令,在请求时将数据 ID 作为 Key 保存到Redis中,当请求操作完成后,删除该 Key ,途中额外请求在调用 setnx 命令插入时将会失败,该方式与去重表方式类似,只是将数据存到缓存中,效率更高。

 

4.Token令牌

客户端在进入页面时,提前向系统发起申请 Token 的请求,系统生成 Token 保存到缓存中并返回给客户端,客户端在发起正式请求时,带上申请到的 Token,系统会判断缓存中是否存在该 Token ,如果存在则表示这是首次请求,删除缓存中的 Token 后开始处理请求,如果缓存中不存在,则已经请求过了。

 

你可能感兴趣的:(个人专栏,分布式,redis,架构,mysql,java)