抢购活动php,php结合redis实现高并发下的抢购、秒杀功能
使用redis队列,因为pop操作是原子的,即使有很多用户同时到达,也是依次执行,推荐使用(mysql事务在高并发下性能下降很厉害,文件锁的方式也是)先将商品库存如队列<?php
$store=1000;
$redis=new Redis();
$result=$redis->connect('127.0.0.1',6379);
$res=$redis->llen('goods_store');
echo $res;
$count=$store-$res;
for($i=0;$i
$redis->lpush('goods_store',1);
}
echo $redis->llen('goods_store');
?>抢购、描述逻辑<?php
$conn=mysql_connect("localhost","big","123456");
if(!$conn){
echo "connect failed";
exit;
}
mysql_select_db("big",$conn);
mysql_query("set names utf8");
$price=10;
$user_id=1;
$goods_id=1;
$sku_id=11;
$number=1;
//生成唯一订单号
function build_order_no(){
return date('ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);
}
//记录日志
function insertLog($event,$type=0){
global $conn;
$sql="insert into ih_log(event,type)
values('$event','$type')";
mysql_query($sql,$conn);
}
//模拟下单操作
//下单前判断redis队列库存量
$redis=new Redis();
$result=$redis->connect('127.0.0.1',6379);
$count=$redis->lpop('goods_store');
if(!$count){
insertLog('error:no store redis');
return;
}
//生成订单
$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=mysql_query($sql,$conn);
//库存减少
$sql="update ih_store set number=number-{$number} where sku_id='$sku_id'";
$store_rs=mysql_query($sql,$conn);
if(mysql_affected_rows()){
insertLog('库存减少成功');
}else{
insertLog('库存减少失败');
}
上述只是简单模拟高并发下的抢购,真实场景要比这复杂很多,很多注意的地方
如抢购页面做成静态的,通过ajax调用接口
再如上面的会导致一个用户抢多个,思路:排队队列
抢购结果队列
库存队列。
高并发情况,先将用户进入排队队列,从排队队列取出一个用户,判断用户是否已在抢购结果队列,如果在,则已抢购,否则未抢购,库存减1,写数据库,将用户入结果队列这里提供一个思路:
//排队队列
$strQueueName = 'paidui';
define('MAX_REQUEST',10);
if ( $strCount < MAX_REQUEST ) {
$redis->rpush($strQueueName, json_encode(['uid' => 1,'name' => 'Job']));
}else {
echo '已购完';
exit;
}
// 处理抢购 逻辑
// 对比 抢购结果队列, 该用户是否已经购买过商品
$userinfo = $redis->lpop('qiangou_list');
if ( is_result_qianggou($userinfo['id']) ) {
echo '已经购买过了';
exit;
}
// 1. 判断商品是否还有
$count=$redis->lpop('goods_store');
if ( !$count ) {
echo "没有了";
}
// 处理抢购逻辑
insert_mysql_goods();
$redis->rpush('qianggou_result', json_encode(['uid' => 1,'name' => 'Job'])); // 加入到抢购结果队列
// 抢购结束后,
// 异步存入 抢购结果 到mysql
$_qianggou = $redis->lpop('qianggou');
ps: 只是一个思路引子,具体线上服务,根据自己的场景. 异步, 静态化,cache. 订阅,发布.
本文由 舒舒 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: Mar 16, 2017 at 03:12 pm
抢购活动php,php结合redis实现高并发下的抢购、秒杀功能相关推荐
- java redis实现抢购_【抢购/秒杀】redis实现高并发下的抢购/秒杀功能
问题: 抢购/秒杀是如今很常见的一个应用场景,那么高并发竞争下如何解决超抢(或超卖库存不足为负数的问题)呢? 常规写法: 查询出对应商品的库存,看是否大于0,然后执行生成订单等操作,但是在判断库存是否 ...
- PHP redis秒杀返回结果,php结合redis实现高并发下的抢购、秒杀功能
抢购.秒杀是如今很常见的一个应用场景,主要需要解决的问题有两个: 1 高并发对数据库产生的压力 2 竞争状态下如何解决库存的正确减少("超卖"问题) 对于第一个问题,已经很容易想到 ...
- php结合redis实现高并发下的抢购、秒杀功能
抢购.秒杀是如今很常见的一个应用场景,主要需要解决的问题有两个: 1 高并发对数据库产生的压力 2 竞争状态下如何解决库存的正确减少("超卖"问题) 对于第一个问题,已经很容易想到 ...
- 简单实现redis实现高并发下的抢购/秒杀功能
简述 抢购/秒杀是如今很常见的一个应用场景,那么高并发竞争下如何解决超抢(或超卖库存不足为负数的问题)呢? 常规写法: 查询出对应商品的库存,看是否大于0,然后执行生成订单等操作,但是在判断库存是否大 ...
- PHP 结合redis实现高并发下抢购、秒杀
抢购.秒杀是如今很常见的一个应用场景,主要需要解决的问题有两个: 1 高并发对数据库产生的压力 2 竞争状态下如何解决库存的正确减少("超卖"问题) 对于第一个问题,已经很容易想到 ...
- PHP和Redis实现在高并发下的抢购及秒杀功能示例详解
抢购.秒杀是平常很常见的场景,面试的时候面试官也经常会问到,比如问你淘宝中的抢购秒杀是怎么实现的等等. 抢购.秒杀实现很简单,但是有些问题需要解决,主要针对两个问题: 一.高并发对数据库产生的压力 二 ...
- php post发微博,php结合redis实现高并发下发帖、发微博的方法
本篇文章主要介绍php结合redis实现高并发下发帖.发微博的方法,感兴趣的朋友参考下,希望对大家有所帮助. 发帖.发微博.点赞.评论等这些操作很频繁的动作如果并发量小,直接入库是最简单的 但是并发量 ...
- go http 并发数限制_618临近,Redis优化高并发下的抢枪抢买买买性能
随着618的临近,各种促销活动开始变得热门起来,比较主流的有秒杀.抢优惠券.拼团等等.涉及到高并发争抢同一个资源的主要场景有秒杀和抢优惠券. 本文内容 使用Redis优化高并发场景下的接口性能 数据库 ...
- Springboot整合Redis,高并发下访问缓存与写入缓存
1.配置Redis连接:添加pox.xml依赖: <!-- redis --><dependency><groupId>org.springframework.bo ...
最新文章
- C++调用openssl使用sha256,并取结果前64位作为uint64
- C#如何使用REST接口读写数据
- css中那些容易被我们程序猿所忽略的选择器
- 【深度学习】基于深度学习的目标检测研究进展
- .编写一个函数实现n^k,使用递归实现
- POJ 1061 BZOJ 1477 Luogu P1516 青蛙的约会 (扩展欧几里得算法)
- python求50的阶乘_python中求阶乘
- JavaScript-打开新窗口(window.open)
- 协程与线程, 进程的区别
- NHibernate学习之五:三种常见的配置方法。
- Windows7中右键菜单无新建文本文档选项的解决办法(注册表)
- Maven 本地仓库明明有jar包,pom文件还是报错解决办法(Missing artifact...jar)
- 拓端tecdat|R语言时间序列数据指数平滑法分析交互式动态可视化
- Android studio 报错 Gradle sync failed 你的主机中的软件中止了一个已建立的连接
- java 多线程高级面试_15个顶级Java多线程面试题及答案
- Java读取Rinex 2.11格式的观测值o文件
- 固态硬盘与普通硬盘有哪些区别?
- c语言strlen转义字符,转义字符 sizeof strlen
- vue+echarts+springboot实现云词图
- kaggle:NBA球员投篮数据分析与可视化