<?php
header('content-type:text/html;charset=utf-8');
 
         
    // //无控制
    // $DB_DSN = 'mysql:dbname=blog;host=127.0.0.1';
    // $DB_USER = 'root';
    // $DB_PWD = 'root';
     
    // $pdo = new PDO($DB_DSN, $DB_USER, $DB_PWD);
    // $pdo->setAttribute(PDO::ATTR_PERSISTENT, true); // 设置数据库连接为持久连接
    // $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 设置抛出错误
    // $pdo->setAttribute(PDO::ATTR_ORACLE_NULLS, true); // 设置当字符串为空转换为 SQL 的 NULL
    // $pdo->query('SET NAMES utf8'); // 设置数据库编码
         
    // function build_order_no() { //生成唯一订单
    //   return date('ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);
    // }
     
    // $price=10;
    // $user_id=1;
    // $goods_id=1;
    // $sku_id=11;
    // $number=1;
     
    // //模拟下单操作
    // //库存是否大于0
    // //解锁 此时ih_store数据中goods_id='$goods_id' and sku_id='$sku_id' 的数据被锁住(注3),其它事务必须等待此次事务 提交后才能执行
    // $sql = "select number from ih_store where goods_id='$goods_id' and sku_id='$sku_id'";
    // $rs = $pdo->query($sql);
    // $row = $rs->FetchColumn();
    // if($row > 0){ //高并发下会导致超卖
    //  $order_sn = build_order_no();
         
    //  //生成订单
    //  $sql="insert into ih_order(order_sn,user_id,goods_id,sku_id,price)
    //  values('$order_sn','$user_id','$goods_id','$sku_id','$price')";
    //  $order_rs = $pdo->query($sql);
          
    // // var_dump($order_rs);die;
    //  //库存减少
    //  $sql="update ih_store set number=number-{$number} where sku_id='$sku_id'";
    //  $store_rs = $pdo->query($sql);
         
    // //   if($store_rs->rowCount()) {
    // //       error_log('订单号:'.$order_sn.'库存减少成功<br>');
    // //   } else {
    // //       error_log('订单号:'.$order_sn.'库存减少失败<br>');
    // //   }
 
    // // }else{
    // //   //error_log('库存不够<br>');
    // }
     
     
     
     
    // //开启事物
    // $DB_DSN = 'mysql:dbname=blog;host=127.0.0.1';
    // $DB_USER = 'root';
    // $DB_PWD = 'root';
     
    // $pdo = new PDO($DB_DSN, $DB_USER, $DB_PWD);
    // $pdo->setAttribute(PDO::ATTR_PERSISTENT, true); // 设置数据库连接为持久连接
    // $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 设置抛出错误
    // $pdo->setAttribute(PDO::ATTR_ORACLE_NULLS, true); // 设置当字符串为空转换为 SQL 的 NULL
    // $pdo->query('SET NAMES utf8'); // 设置数据库编码
         
    // function build_order_no() { //生成唯一订单
    //   return date('ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);
    // }
     
    // $price=10;
    // $user_id=1;
    // $goods_id=1;
    // $sku_id=11;
    // $number=1;
     
    // //模拟下单操作
    // //库存是否大于0
    // //解锁 此时ih_store数据中goods_id='$goods_id' and sku_id='$sku_id' 的数据被锁住(注3),其它事务必须等待此次事务 提交后才能执行
 
    // $pdo->query('BEGIN');
 
    // $sql = "select number from ih_store where goods_id='$goods_id' and sku_id='$sku_id'";
    // $rs = $pdo->query($sql);
    // $row = $rs->FetchColumn();
    // if($row > 0){ //高并发下会导致超卖
    //  $order_sn = build_order_no();
         
    //  //生成订单
    //  $sql="insert into ih_order(order_sn,user_id,goods_id,sku_id,price)
    //  values('$order_sn','$user_id','$goods_id','$sku_id','$price')";
    //  $order_rs = $pdo->query($sql);
          
    //  //库存减少
    //  $sql="update ih_store set number=number-{$number} where sku_id='$sku_id'";
    //  $store_rs = $pdo->query($sql);
         
    //  // if($store_rs->rowCount()) {
    //  //  error_log('订单号:'.$order_sn.'库存减少成功<br>');
    //      $pdo->query('COMMIT');
    //  // } else {
    //  //  error_log('订单号:'.$order_sn.'库存减少失败<br>');
    //  // }
 
    // // var_dump($order_rs);die;
    // }else{
    //  //error_log('库存不够<br>');
    //  $pdo->query('ROLLBACK');
         
    // }
     
     
     
 
     
    // //使用非阻塞的文件排他锁
    // $DB_DSN = 'mysql:dbname=blog;host=127.0.0.1';
    // $DB_USER = 'root';
    // $DB_PWD = 'root';
     
    // $pdo = new PDO($DB_DSN, $DB_USER, $DB_PWD);
    // $pdo->setAttribute(PDO::ATTR_PERSISTENT, true); // 设置数据库连接为持久连接
    // $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 设置抛出错误
    // $pdo->setAttribute(PDO::ATTR_ORACLE_NULLS, true); // 设置当字符串为空转换为 SQL 的 NULL
    // $pdo->query('SET NAMES utf8'); // 设置数据库编码
         
    // function build_order_no() { //生成唯一订单
    //   return date('ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);
    // }
     
    // $price=10;
    // $user_id=1;
    // $goods_id=1;
    // $sku_id=11;
    // $number=1;
     
    // //模拟下单操作
    // //库存是否大于0
 
    // $fp = fopen("lock.txt", "w+");
    // if(!flock($fp,LOCK_EX | LOCK_NB)){
    //  echo "系统繁忙,请稍后再试";
    //  return;
    // }
 
    // $sql = "select number from ih_store where goods_id='$goods_id' and sku_id='$sku_id'";
    // $rs = $pdo->query($sql);
    // $row = $rs->FetchColumn();
     
    // if($row > 0){ //高并发下会导致超卖
    //  $order_sn = build_order_no();
         
     
          
    //  //库存减少
    //  $sql="update ih_store set number=number-{$number} where sku_id='$sku_id'";
    //  $store_rs = $pdo->query($sql);
         
    //  if($store_rs->rowCount()) {
 
    //          //生成订单
    //  $sql="insert into ih_order(order_sn,user_id,goods_id,sku_id,price)
    //  values('$order_sn','$user_id','$goods_id','$sku_id','$price')";
    //  $order_rs = $pdo->query($sql);
    //      error_log('订单号:'.$order_sn.'库存减少成功<br>');
    //  } else {
    //      error_log('订单号:'.$order_sn.'库存减少失败<br>');
    //  }
    //  flock($fp,LOCK_UN);//释放锁
    // }else{
    //  error_log('库存不够<br>');
    // }
    // fclose($fp);
     
         
     
     
    //队列
     
     
    $store = 500;
    $redis = new Redis();
    $result = $redis->connect('127.0.0.1', 6379);
    $redis->FLUSHALL();
 
    $res = $redis->llen('goods_store');
     
    $count = $store-$res;
    for($i=1;$i<=$count;$i++){
        $redis->lpush('goods_store', $i);
    }
    echo $redis->llen('goods_store');
    exit;
     
     
 
     
     
 
 
    $DB_DSN = 'mysql:dbname=blog;host=127.0.0.1';
    $DB_USER = 'root';
    $DB_PWD = 'root';
     
    $pdo = new PDO($DB_DSN, $DB_USER, $DB_PWD);
    $pdo->setAttribute(PDO::ATTR_PERSISTENT, true); // 设置数据库连接为持久连接
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 设置抛出错误
    $pdo->setAttribute(PDO::ATTR_ORACLE_NULLS, true); // 设置当字符串为空转换为 SQL 的 NULL
    $pdo->query('SET NAMES utf8'); // 设置数据库编码
     
    function build_order_no() { //生成唯一订单
        $sn = microtime().''.rand(10000,100000).''.microtime().''.rand(10000,100000);
        return $sn;
      //return date('ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);
    }
     
    $price=10;
    $user_id=1;
    $goods_id=1;
    $sku_id=11;
    $number=1;
     
    //模拟下单操作
    $redis=new Redis();
    $result=$redis->connect('127.0.0.1', 6379);
    $count = $redis->rpop('goods_store');
     
    if(!$count){
        error_log('队列'.$count.'redis:库存不足');
    } else {
 
        $order_sn = build_order_no();
         
        //生成订单
        $sql="insert into ih_order(order_sn,user_id,goods_id,sku_id,price) values('$order_sn','$user_id','$goods_id','$sku_id','$price')";
        $order_rs = $pdo->query($sql);
              
        //库存减少
        $sql="update ih_store set number=number-{$number} where sku_id='$sku_id'";
        $store_rs = $pdo->query($sql);
         
        if($store_rs->rowCount()) {
            error_log('队列:'.$count.'订单号:'.$order_sn.'库存减少成功<br>');
        } else {
            error_log('队列:'.$count.'订单号:'.$order_sn.'库存减少失败<br>');
        }
    }
    

自我感觉,文件排它锁比较慢,pdo处理高并发效果一般,redis是最有效的

高并发下用pdo,文件排它锁,redis三种方法对比的更多相关文章

  1. linux清空文件内容的三种方法

    linux系统中清空文件内容的三种方法 1.使用vi/vim命令打开文件后,输入"%d"清空,后保存即可.但当文件内容较大时,处理较慢,命令如下:vim file_name:%d: ...

  2. 详解linux下批量替换文件内容的三种方法(perl,sed,shell)

    在建设本网站的时候,发现新建了很多的网页,突然发现,每个文件都需要进行修改一样的内容,一个一个打开很是麻烦,所以,总结了一下如何快速修改一个目录下多个文件进行内容替换.第三种方法用的不多 方法一 使用 ...

  3. php读取文件内容的三种方法

    <?php //**************第一种读取方式***************************** 代码如下: header("content-type:text/h ...

  4. Delphi中实现文件拷贝的三种方法

    1.调用API函数procedure CopyFile(FromFileName,ToFileName:string);varf1,f2:file;BeginAssignFile(f1,FromFil ...

  5. Java追加文件内容的三种方法

    import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io. ...

  6. ASP.net 判断上传文件类型的三种方法

    一. 安全性比较低,把文本文件1.txt改成1.jpg照样可以上传,但其实现方法容易理解,实现也简单,所以网上很多还是采取这种方法. Boolean fileOk = false; string pa ...

  7. 用ASP.net判断上传文件类型的三种方法

    一. 安全性比较低,把文本文件1.txt改成1.jpg照样可以上传,但其实现方法容易理解,实现也简单,所以网上很多还是采取这种方法. Boolean fileOk = false;           ...

  8. 前端下载excel文件功能的三种方法

    1 从后端接收json数据,前端处理生成excel下载 JsonExportExcel的github地址:https://github.com/cuikangjie/JsonExportExcel 这 ...

  9. [原]Linux下清空文件内容的三种方法

    ========问题======== 有些文件需要清空内容而不改变属性 =======解决方案====== 1.直接删除,创建同名文件.(这种方法的弊端是有可能这个文件带着权限或者是属性,那么你新建这 ...

随机推荐

  1. php 微信开发之新增上传/获取下载临时素材

    php 微信开发之新增上传/获取下载临时素材 代码 <?php define("AppID","");//你的id define("AppSec ...

  2. 让子元素在父元素中水平居中align-items

    做案例中,我们会发现让子元素在父元素中垂直居中,要设置margin和padding等,各种设置才能垂直居中 现在可以使用CSS3中的align-items实现 align-items 定义子元素在父元 ...

  3. android requestLayout()重新请求布局

    在应用中有时会遇到,例如你listView 的设置的高度为warp_content 自适应,listView下方有个TextView但如果你删了一个listView的item 我们希望下面的TextV ...

  4. DLX精确覆盖与重复覆盖模板题

    hihoCoder #1317 : 搜索四·跳舞链 原题地址:http://hihocoder.com/problemset/problem/1317 时间限制:10000ms 单点时限:1000ms ...

  5. 微信小程序的文件结构 —— 微信小程序教程系列(1)

    所有文章均是CSDN博客所看,已按照作者要求,注明出处了,感谢作者的整理! 博客文章地址:http://blog.csdn.net/michael_ouyang/article/details/548 ...

  6. Linux 安装OpenSSL出错的解决方法

    以前编译php没有 –with–openssl 现在要使用到 openssl ,phpinze扩展安装,但是在make时候报错 今天找这个在网上找了大半天,最后总结应该是php版本本身的问题,错误是p ...

  7. java拾遗3----XML解析(三) StAX PULL解析

    使用PULL方式解析XML: Pull是STAX的一个实现 StAX是The Streaming API for XML的缩写,一种利用拉模式解析(pull-parsing)XML文档的API StA ...

  8. JAVA NIO 简介 (netty源码死磕1.1)

    [基础篇]netty 源码死磕1.1:  JAVA NIO简介 1. JAVA NIO简介 Java 中 New I/O类库 是由 Java 1.4 引进的异步 IO.由于之前老的I/O类库是阻塞I/ ...

  9. js网页视频播放: vcastr22 、 flowplayer 、 jwplayer

    实例结构: 实例1: demo.html <embed src="vcastr22.swf?vcastr_file=../wujiandao.flv" allowFullSc ...

  10. Django之表单验证

    对于前端的表单进行验证的方法,从最简单的js到基于XML传输的Ajax,再到cookie的免认证,现在Django为我们提供了自带的表单验证方法. views.py: from django impo ...