• 解决并发所带来的数据不一致性


      测试前提,linux服务器 ,因为windows服务器下 nginx + php是fashcgi方式,默认是单进程单线程的,所有的并发请求都要排队处理,所以在windows服务器下测试时没有任何效果的。

      首先上一段代码:

      

      这段代码的逻辑很简单,类似于商品库存一样,stock为库存,count为购买数量,每购买一次 count + 1,生成一个随机的txt文件,因为是模拟,那么这里我们就把txt文件模拟为订单吧,每购买一次,生成一个新的订单。这个程序正常情况下count数会和生成的txt文件的数量是一致的,而且订单数也不会超过库存数,因为这里有判断条件,当count等于stock的时候程序就退出了,也不会有新的订单生成。但是有一种情况会导致出现订单数大于库存数, 那就是 - - - - - - 并发。

      

      接下来先模拟一波非并发的情况。

      1.设置count数为0

      

      2.设置订单数为空

      

       3.用Apache ab测试模拟100次请求。

      

      

      

      

       如上图所示,请求执行完后,count数为10个,订单数为10个,订单数是和count数保持一致的。

      接下来把log文件夹再次清空,同时把count改为0,测试一下100次请求,10次并发下的结果。

      

      

      

      

      可能压力测试模拟并发的时候会有丢包,或者随机数出现相同的了,但是可以看出在并发条件下,txt文件为15个,count数为10,订单数和count数已经不一致了。

      

      解决方法一: 加文件锁,在多个进程对同一个文件进行独占锁定操作,发生阻塞时记录错误日志,并退出程序

      

      接下来再模拟 100次请求10次并发结果如下

      

      

      

      

      

      如上图所示,最终生成的txt文件和count保持一致,测试成功!!

  • 相关阅读:
    Installing PHP-7 with Memcached
    在Ubuntu1.4下升级php和Yii2
    apache设置反向代理实现前端js跨域访问
    mysql多重排序判断,根据状态区分时间排序方式
    利用缓存锁解决接口连续访问
    phpstorm启动内存配置
    ubuntu ssh修改用户密码
    Yii2手动安装第三方扩展(转)
    html input file 设置文件类型
    yii2 gridView中使用下拉列表筛选数据
  • 原文地址:https://www.cnblogs.com/smallbo/p/6582142.html
Copyright © 2020-2023  润新知