高并发下用pdo,文件排它锁,redis三种方法对比
<?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三种方法对比的更多相关文章
- linux清空文件内容的三种方法
linux系统中清空文件内容的三种方法 1.使用vi/vim命令打开文件后,输入"%d"清空,后保存即可.但当文件内容较大时,处理较慢,命令如下:vim file_name:%d: ...
- 详解linux下批量替换文件内容的三种方法(perl,sed,shell)
在建设本网站的时候,发现新建了很多的网页,突然发现,每个文件都需要进行修改一样的内容,一个一个打开很是麻烦,所以,总结了一下如何快速修改一个目录下多个文件进行内容替换.第三种方法用的不多 方法一 使用 ...
- php读取文件内容的三种方法
<?php //**************第一种读取方式***************************** 代码如下: header("content-type:text/h ...
- Delphi中实现文件拷贝的三种方法
1.调用API函数procedure CopyFile(FromFileName,ToFileName:string);varf1,f2:file;BeginAssignFile(f1,FromFil ...
- Java追加文件内容的三种方法
import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io. ...
- ASP.net 判断上传文件类型的三种方法
一. 安全性比较低,把文本文件1.txt改成1.jpg照样可以上传,但其实现方法容易理解,实现也简单,所以网上很多还是采取这种方法. Boolean fileOk = false; string pa ...
- 用ASP.net判断上传文件类型的三种方法
一. 安全性比较低,把文本文件1.txt改成1.jpg照样可以上传,但其实现方法容易理解,实现也简单,所以网上很多还是采取这种方法. Boolean fileOk = false; ...
- 前端下载excel文件功能的三种方法
1 从后端接收json数据,前端处理生成excel下载 JsonExportExcel的github地址:https://github.com/cuikangjie/JsonExportExcel 这 ...
- [原]Linux下清空文件内容的三种方法
========问题======== 有些文件需要清空内容而不改变属性 =======解决方案====== 1.直接删除,创建同名文件.(这种方法的弊端是有可能这个文件带着权限或者是属性,那么你新建这 ...
随机推荐
- 2013 年最好的 20 款免费 jQuery 插件
2013 年最好的 20 款免费 jQuery 插件 oschina 发布于: 2014年01月11日 (8评) 分享到 新浪微博腾讯微博 收藏+99 互联网上面有很多 jQuery 插件,这里我们 ...
- 嵌入式驱动开发之sensor---sensor 图形传感器调试
图像传感器(image sensor)复位顺序 1. 硬件复位寄存器:2. 软件复位寄存器:3. 设置时钟寄存器:4. 设置PLL倍频:5. 设置分辨率:6. 设置窗口控制:7. 设置输出顺序:8. ...
- ASP.NET动态网站制作(19)-- C#(2)
前言:C#的第二次课,依旧讲解C#的基础知识. 内容: 1.GC:垃圾回收机制,可以回收托管模块中的垃圾. 2.值类型和引用类型: (1)值类型:所有的数值类型都是值类型,如int,byte,sho ...
- TortoiseSVN与VisualSVN Server搭建SVN版本控制系统(转)
地址:http://www.cnblogs.com/xing901022/p/4399382.html
- web安全之SQL注入---第三章 如何寻找sql注入?
借助逻辑推理1.识别web应用中所有输入点2.了解哪些类型的请求会触发异常3.检测服务器响应中的异常 总结: 输入点无非就是:地址栏.和输入框 输入康输入一些非法字符,导致后台的sql语句错误,
- 基于jquery的bootstrap在线文本编辑器插件Summernote (转)
Summernote是一个基于jquery的bootstrap超级简单WYSIWYG在线编辑器.Summernote非常的轻量级,大小只有30KB,支持Safari,Chrome,Firefox.Op ...
- python 深复制与浅复制------copy模块
模块解读: 浅复制: x = copy.copy(y)深复制: x = copy.deepcopy(y)(注:模块特有的异常,copy.Error) 深copy与浅copy的差别主要体现在当有混合对象 ...
- vim对光标所在的数字进行增减
真是vim会在不经意间给你惊喜...... 现在发现把光标移到某数字的上方,c-a是加1, c-x是减1 当时真有点众里寻他千百度的感觉
- ubuntu16.04下hive安装与配置
Hive是什么? 由Facebook开源用于解决海量 结构化日志的数据统计: Hive是基于Hadoop的一个 数据仓库工具,可以将结构化的数据文件映射 成一张表,并提供类SQL查询功能: 构建在Ha ...
- PLSQL使用技巧----加快你的编程效率
使用PLSQL 编程效率明显有所提高了 1.登录后默认自动选中My Objects 默认情况下,PLSQL Developer登录后,Brower里会选择All objects,如果你登录的 ...