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

#幂等性概念nginx

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

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

#技术方案编程

  一、查询操做服务器

    查询一次和查询屡次,在数据不变的状况下,查询结果是同样的。select是自然的幂等操做。网络

  二、删除操做并发

    删除操做也是幂等的,删除一次和删除屡次都是把对应的数据删除,若是数据已经不在了也不会产生反作用jvm

  ·三、惟一索引ide

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

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

  四、token机制

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

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

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

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

            三、token特色:要申请,一次有效性,能够限流。

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

  五、悲观锁

    获取数据的时候加锁获取

       

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

        ps: id字段必定是主键或者惟一索引,否则是锁表,会死人的。悲观锁通常伴随事务一块儿使用,事务锁定时间可能会很长,根据实际状况选用

  六、乐观锁

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

      一、经过版本号实现:

        

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

      二、经过条件限制

       

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

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

                                                                            ps:未完待续。

相关文章
相关标签/搜索