高并发下接口幂等性的解决方案

#幂等性概念

  幂等(idempotent)是一个数学与计算机学概念,常见于抽象代数中。在编程中,一个幂等操作的特点是其任意多次执行所产生的影响与执行一次产生的影响相同。

  幂等函数,或者幂等方法,是指可以使用相同参数重复执行,并且多次执行所获取的结果均相。这些函数方法的执行并不会影响系统的状态

#技术方案

  1、查询操作

    查询一次和查询多次,在数据不变的情况下,查询结果是一样的。select是天然的幂等操作。

  2、删除操作

    删除操作也是幂等的,删除一次和删除多次都是把对应的数据删除,如果数据已经不在了也不会产生副作用

  ·3、唯一索引

    防止新增脏数据。比如:支付宝的资金账户,支付宝也有用户账户,每个用户只能有一个资金账户,如何防止给用户创建多个资金账户,那么给资金账户表中的用户id加唯一索引

    此处要点为:通过唯一索引或唯一组合索引来防止新增数据时存在脏数据(当表中存在唯一索引时,并发新增必然报错,此时只需要查询一下返回结果即可)

  4、token机制

    防止页面重复提交。业务要求:页面数据只能被点击提交一次。发生的原因:由于在用户重复点击的情况下或者网络重发的情况下,或者nginx重发发送等情况下会导致数据被重复提交。

    解决方案:集群采用token加redis(因为redis是单线程的,处理需要排队);单JVM环境,采用token加redis或token加jvm内存。

    处理流程:1、数据提交前需要向服务器申请token,token放到redis 或jvm内存中,token有效时间;

            2、提交后后台校验token,同时删除token,生成新的token返回。

            3、token特点:要申请,一次有效性,可以限流。

        ps:redis要用删除操作来判断token,删除成功代表token校验通过,不建议使用select+delete来校验,会有并发问题

  5、悲观锁

    获取数据的时候加锁获取

       

1 select * from tbl where  id = xxx  for update;

        ps: id字段一定是主键或者唯一索引,不然是锁表,会死人的。悲观锁一般伴随事务一起使用,事务锁定时间可能会很长,根据实际情况选用

  6、乐观锁

    乐观锁只是在更新数据的那一刻锁表,其它时间不锁表,所以相对悲观锁,效率更高,乐观锁的实现方式多种多样:

      1、通过版本号实现:

        

update tbl set name = xxx,version = version+1 where version = ${version}

      2、通过条件限制

       

update tbl set amount = amount-${amount}  where amount - ${amount} >=0

         要求:quality-¥{subQuality} >= ,这个情况适合不校验,适合库存模型,扣份额和回滚份额,性能更高。

                                                                            ps:未完待续。

猜你喜欢

转载自www.cnblogs.com/fankh/p/12194085.html