php 秒杀并发怎么做,PHP实现高并发下的秒杀功能–Laravel
namespace App\Http\Controllers\SecKill;
use App\Http\Controllers\Controller;
use Exception;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Redis;
class SecKillController extends Controller
{
/**
* 往redis的隊列中添加庫存(用於測試的數據)
*
*/
public function setAddRedis(){
$store=150;
$res=Redis::llen('goods_store');
echo $res;
$count=$store-$res;
for($i=0;$i
Redis::lpush('goods_store',1);
}
echo Redis::llen('goods_store');
}
//生成唯一订单号
public function build_order_no(){
return date('ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);
}
/**
* 使用redis队列,因为pop操作是原子的,即使有很多用户同时到达,也是依次执行,推荐使用(mysql事务在高并发下性能下降很厉害,文件锁的方式也是)
* @param $goods_id
* @return string
*/
public function getGood($goods_id){
$price =10;
$count = Redis::lpop("goods_store");
if(!$count){
return "error:no store redis";
}
$order_sn=$this->build_order_no();
DB::insert('insert into ih_order (order_sn,user_id,goods_id,price) values (?, ?,?,?)', [$order_sn, rand(1,15),$goods_id,$price]);
$res = DB::update('update in_store set store_number = store_number-1 where goods_id = ?', [$goods_id]);
if($res){
return "库存减少成功";
} else{
return "库存减少失敗";
}
}
public function doLog($log){
file_put_contents("test.txt",$log.'\r\n',FILE_APPEND);
}
/**
*
* desc 在事务中对数据进行加锁,当事务进行提交(commit)或者回滚(rollBack)时都会取消锁。
* 单纯的开启一个事务,并不会对事务中的数据进行加锁,只会保证数据的完整性.其他数据是否可以访问,不能保证数据库的数据单一操作
* @param $goods_id
* @return bool
*/
public function getGoodByMysql($goods_id){
// 开启事务
DB::beginTransaction();
try {
// 需要处理的逻辑 doSomething;
$res = DB::table("in_store")->where(['goods_id'=>$goods_id])->sharedLock()->first();
//对事务中数据进行加锁(悲观锁)
if($res->store_number) {
$store_number = $res->store_number-1;
$num = DB::table('in_store')->where('goods_id',$goods_id)->decrement('store_number');
if($num) {
// 提交事务
DB::commit();
$msg = "减少库存成功";
} else {
$msg = "减少库存失败";
}
} else {
$msg ="库存不够";
}
DB::rollBack();
return $msg;
} catch (Exception $e) {
// 数据回滚, 当try中的语句抛出异常。
DB::rollBack();
return false;
// 执行一些提醒操作等等...
}
}
}来源:http://www.icode9.com/content-1-56851.html
php 秒杀并发怎么做,PHP实现高并发下的秒杀功能–Laravel相关推荐
- 高并发下的秒杀系统架构设计实战!
1.秒杀业务分析 正常电子商务流程 (1)查询商品: (2)创建订单: (3)扣减库存: (4)更新订单: (5)付款: (6)卖家发货: 秒杀业务的特性 (1)低廉价格: (2)大幅推广: (3)瞬 ...
- PHP实现高并发下的秒杀功能–Laravel
namespace App\Http\Controllers\SecKill; use App\Http\Controllers\Controller; use Exception; use Illu ...
- redis抽奖并发_Redis优化高并发下的秒杀性能
本文内容 使用Redis优化高并发场景下的接口性能 数据库乐观锁 随着双11的临近,各种促销活动开始变得热门起来,比较主流的有秒杀.抢优惠券.拼团等等. 涉及到高并发争抢同一个资源的主要场景有秒杀和抢 ...
- 高并发下商城秒杀活动的处理
秒杀抢购活动是现在很多商城常见的营销手段,小米抢购.淘宝的整点免单.聚划算等都是成功的例子. 从简单处着手,秒杀是很好理解的:设置要秒杀的商品的数量,抢完为止.但是,实际应用中一瞬间的高并发压力.以及 ...
- java 并发抢单_java如何实现高并发下的抢单?
/** * ---------------------------------------------------- * 使用AtomicInteger实现 * 实际上Atomic类比volatile ...
- 电商平台 高并发 微服务 方案_Java生鲜电商平台-秒杀系统微服务架构设计与源码解析实战...
Java生鲜电商平台- 什么是秒杀 通俗一点讲就是网络商家为促销等目的组织的网上限时抢购活动 比如说京东秒杀,就是一种定时定量秒杀,在规定的时间内,无论商品是否秒杀完毕,该场次的秒杀活动都会结束.这种 ...
- php小程序秒抢高并发,PHP 如何设计一个高并发高可用的秒杀或抢券系统
一个大型网站应用一般都是从最初小规模网站甚至是单机应用发展而来的,为了让系统能够支持足够大的业务量,从前端到后端也采用了各种各样技术,前端静态资源压缩整合.使用CDN.分布式SOA架构.缓存.数据库加 ...
- 秒杀并发java_java 高并发秒杀
UP############又在放屁了######真牛######对,社区还有说过亿的并发的呢######这个要顶,说的非常正确###### 不用扣字眼吧 的确你说的没错,操作系统里的"并发 ...
- 【高并发】Redis如何助力高并发秒杀系统?看完这篇我彻底懂了!!
秒杀业务 在电商领域,存在着典型的秒杀业务场景,那何谓秒杀场景呢.简单的来说就是一件商品的购买人数远远大于这件商品的库存,而且这件商品在很短的时间内就会被抢购一空.比如每年的618.双11大促,小米新 ...
最新文章
- LDD3源码分析之字符设备驱动程序
- mysql-proxy安装包_Mysql-proxy安装
- 宏BOOST_TEST_TRAIT_TRUE的用法
- php protected const,关于const:PHP类常量 – 公共,私有还是受保护?
- 用java实现串匹配问题_java实现字符串匹配问题之求最大公共子串
- Python 语言 Hello world
- sql加上唯一索引后批量插入_MySQL批量插入遇上唯一索引避免方法
- FPGA开发设计流程
- c mysql对时间加减_25.2.10. 日期和时间值的C API处理
- 思维导图案例之VeritasDCG
- npm下载安装 nodejs下载安装
- Java突击学习 Day2 Part1
- 水煮TCPMP (转)
- Android 5.0特性
- JavaScript 编程精解 中文第三版 十七、在画布上绘图
- 相机焦距、像元大小构造内参矩阵
- 计算机技术在图形图像处理中的应用,计算机图形图像处理技术综述
- Excel从手机号和座机号混合文本中提取手机号码
- html盒子模型的实例,html盒模型的示例分析
- SSL P1194 最优乘车 题目