PHP 高并发秒杀解决方案
本文提供 PHP 高并发秒杀解决方案(附加三个案例说明(普通流程,使用文件锁,使用redis消息队列))
1:(正常流程,不做任何高并发处理),代码如下:
<?php
$_mysqli = new mysqli('localhost','root','','secondkill');
if (mysqli_connect_errno()) {
echo mysqli_connect_error();
exit();
}
$_mysqli->set_charset('utf8');
$_sql = "select stock from goods where id=1";
$_result = $_mysqli->query($_sql);
$_assoc = $_result->fetch_assoc();
if($_assoc['stock']>0){
$_sql = "UPDATE goods SET stock=stock-1 WHERE id=1";
$_mysqli->query($_sql);
}
$_mysqli->close();
?>
2:(使用文件锁),代码如下:
<?php
$_mysqli = new mysqli('localhost','root','','secondkill');
if (mysqli_connect_errno()) {
echo mysqli_connect_error();
exit();
}
$_mysqli->set_charset('utf8');
$_sql = "select stock from goods where id=2";
$_result = $_mysqli->query($_sql);
$_assoc = $_result->fetch_assoc();
$fp = fopen("lock.txt", "w+");
if(!flock($fp,LOCK_EX | LOCK_NB)){
echo "系统繁忙,请稍后再试";
return;
}
if($_assoc['stock']>0){
$_sql = "UPDATE goods SET stock=stock-1 WHERE id=2";
if($_mysqli->query($_sql)){
flock($fp,LOCK_UN);//释放锁
}
}
fclose($fp);
$_mysqli->close();
?>
3:使用redis 消息队列,代码如下:
<?php $redis=new Redis();
$result=$redis->connect('127.0.0.1',6379); $_mysqli = new mysqli('localhost','root','','secondkill'); if (mysqli_connect_errno()) {
echo mysqli_connect_error();
exit();
}
$_mysqli->set_charset('utf8'); /*
for($i=1;$i<=100;$i++){
$redis->lpush('goods_nums',$i); //秒杀开始前,先将库存数量存在队列,配合定时任务,暂定库存为100
} echo $redis->llen('goods_nums');
exit();
*/ $check = $redis->lpop('goods_nums'); //echo $check; if($check){
echo "秒杀成功";
$_sql = "UPDATE goods SET stock=stock-1 WHERE id=3";
$_mysqli->query($_sql);
return;
} else {
echo "秒杀失败";
} ?>
PHP 高并发秒杀解决方案的更多相关文章
- php高并发秒杀解决方案
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/super_runman/article/details/53037151 在秒杀.抢火车票等地方,我 ...
- Java高并发秒杀系统【观后总结】
项目简介 在慕课网上发现了一个JavaWeb项目,内容讲的是高并发秒杀,觉得挺有意思的,就进去学习了一番. 记录在该项目中学到了什么玩意.. 该项目源码对应的gitHub地址(由观看其视频的人编写,并 ...
- 【高并发】Redis如何助力高并发秒杀系统,看完这篇我彻底懂了!!
写在前面 之前,我们在<[高并发]高并发秒杀系统架构解密,不是所有的秒杀都是秒杀!>一文中,详细讲解了高并发秒杀系统的架构设计,其中,我们介绍了可以使用Redis存储秒杀商品的库存数量.很 ...
- SSM框架学习之高并发秒杀业务--笔记5-- 并发优化
前几节终于实现了这个高并发秒杀业务,现在问题是如何优化这个业务使其能扛住一定程度的并发量. 一. 优化分析 对于整个业务来说,首先是分析哪些地方会出现高并发,以及哪些地方会影响到了业务的性能.可能会出 ...
- SSM框架学习之高并发秒杀业务--笔记1-- 项目的创建和依赖
在慕课网上看了Java高并发秒杀API视屏后,觉得这个案例真的让我学到了很多,现在重新自己实现一遍,博客记下,顺便分析其中的要点. 第一步是项目的创建和依赖 利用Maven去创建工程然后导入Idea中 ...
- Java高并发秒杀系统API之SSM框架集成swagger与AdminLTE
初衷与整理描述 Java高并发秒杀系统API是来源于网上教程的一个Java项目,也是我接触Java的第一个项目.本来是一枚c#码农,公司计划部分业务转java,于是我利用业务时间自学Java才有了本文 ...
- Java高并发秒杀API之Service层
Java高并发秒杀API之Service层 第1章 秒杀业务接口设计与实现 1.1service层开发之前的说明 开始Service层的编码之前,我们首先需要进行Dao层编码之后的思考:在Dao层我们 ...
- Java高并发秒杀API之业务分析与DAO层
根据慕课网上关于java高并发秒杀API的课程讲解用maven+ssm+redis实现的一个秒杀系统 参考了codingXiaxw's blog,很详细:http://codingxiaxw.cn/2 ...
- imooc课程:Java高并发秒杀API 记录
Java高并发秒杀API之业务分析与DAO层 Java高并发秒杀API之Service层 Java高并发秒杀API之web层 Java高并发秒杀API之高并发优化 除了并发部分外的这个web开发的总结 ...
随机推荐
- puppet 横向扩展(一)
目录 1. 概述 2. 实验环境 3. 实验步骤 3.1. 创建puppetmaster的rack环境 3.2. 配置文件设置 3.3. 补充说明 3.4. 测试配置结果 3.4.1. 默认的负载均衡 ...
- 关于LVS负载均衡tcp长连接分发的解决思路
虽然应用keepalived搞定了后端服务负载均衡和高可用性问题,但是在具体应用的时候,还是要注意很多问题.很多应用都用tcp或者http的长连接,因为建立tcp连接或者http连接开销比较大,而应用 ...
- 设计模式のAdapterPattern(适配器模式)----结构模式
一.产生背景 这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能.举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器.您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本 ...
- 解决y7000笔记本ubuntu18.04下 休眠挂起后唤醒花屏
定位问题,切换到核显后发现一点问题也没有,基本确定是显卡驱动的问题 但是由于配置环境比较复杂,不想重新装N卡驱动,所以另寻方法 sudo gedit /etc/default/grub 修改前 # I ...
- git pull的理解 以及 git conflict的解决
git pull:相当于是从远程获取最新版本并merge到本地 即: git fetch -> 与本地的分支(比如master)merge 如果有conflict报错 1 先查看statue - ...
- tensorflow 模型保存与加载 和TensorFlow serving + grpc + docker项目部署
TensorFlow 模型保存与加载 TensorFlow中总共有两种保存和加载模型的方法.第一种是利用 tf.train.Saver() 来保存,第二种就是利用 SavedModel 来保存模型,接 ...
- Doc2vec实现原理
论文来源:https://www.eecs.yorku.ca/course_archive/2016-17/W/6412/reading/DistributedRepresentationsofSen ...
- CSAPP:第三章程序的机器级表示1
CSAPP:程序的机器级表示1 关键点:数据格式.操作数指示符. 数据格式访问信息操作数指示符举例说明 数据格式 术语字(word)表示16位数据类型,32位数为双字(double words), ...
- Python脱产8期 Day05 2019/4/17
数据类型的使用 一 数字类型 1.整型:int 2.浮点型:float 3.重点:数字类型直接相互转化 二字符串类型 一 1.定义:在单引号/双引号/三引号中包含一系列字符. 2.注意:可以通过引号的 ...
- 【Codeforces Round 650】Codeforces #334 (Div. 1)
模拟CF650,ABC三题,RK90 Codeforces 650 A 思路:首先看式子 \(\sqrt{(x_i-x_j)^2+(y_i-y_j)^2}=|x_i-x_j|+|y_i-y_j|\) ...