使用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实现高并发下的抢购、秒杀功能相关推荐

  1. java redis实现抢购_【抢购/秒杀】redis实现高并发下的抢购/秒杀功能

    问题: 抢购/秒杀是如今很常见的一个应用场景,那么高并发竞争下如何解决超抢(或超卖库存不足为负数的问题)呢? 常规写法: 查询出对应商品的库存,看是否大于0,然后执行生成订单等操作,但是在判断库存是否 ...

  2. PHP redis秒杀返回结果,php结合redis实现高并发下的抢购、秒杀功能

    抢购.秒杀是如今很常见的一个应用场景,主要需要解决的问题有两个: 1 高并发对数据库产生的压力 2 竞争状态下如何解决库存的正确减少("超卖"问题) 对于第一个问题,已经很容易想到 ...

  3. php结合redis实现高并发下的抢购、秒杀功能

    抢购.秒杀是如今很常见的一个应用场景,主要需要解决的问题有两个: 1 高并发对数据库产生的压力 2 竞争状态下如何解决库存的正确减少("超卖"问题) 对于第一个问题,已经很容易想到 ...

  4. 简单实现redis实现高并发下的抢购/秒杀功能

    简述 抢购/秒杀是如今很常见的一个应用场景,那么高并发竞争下如何解决超抢(或超卖库存不足为负数的问题)呢? 常规写法: 查询出对应商品的库存,看是否大于0,然后执行生成订单等操作,但是在判断库存是否大 ...

  5. PHP 结合redis实现高并发下抢购、秒杀

    抢购.秒杀是如今很常见的一个应用场景,主要需要解决的问题有两个: 1 高并发对数据库产生的压力 2 竞争状态下如何解决库存的正确减少("超卖"问题) 对于第一个问题,已经很容易想到 ...

  6. PHP和Redis实现在高并发下的抢购及秒杀功能示例详解

    抢购.秒杀是平常很常见的场景,面试的时候面试官也经常会问到,比如问你淘宝中的抢购秒杀是怎么实现的等等. 抢购.秒杀实现很简单,但是有些问题需要解决,主要针对两个问题: 一.高并发对数据库产生的压力 二 ...

  7. php post发微博,php结合redis实现高并发下发帖、发微博的方法

    本篇文章主要介绍php结合redis实现高并发下发帖.发微博的方法,感兴趣的朋友参考下,希望对大家有所帮助. 发帖.发微博.点赞.评论等这些操作很频繁的动作如果并发量小,直接入库是最简单的 但是并发量 ...

  8. go http 并发数限制_618临近,Redis优化高并发下的抢枪抢买买买性能

    随着618的临近,各种促销活动开始变得热门起来,比较主流的有秒杀.抢优惠券.拼团等等.涉及到高并发争抢同一个资源的主要场景有秒杀和抢优惠券. 本文内容 使用Redis优化高并发场景下的接口性能 数据库 ...

  9. Springboot整合Redis,高并发下访问缓存与写入缓存

    1.配置Redis连接:添加pox.xml依赖: <!-- redis --><dependency><groupId>org.springframework.bo ...

最新文章

  1. C++调用openssl使用sha256,并取结果前64位作为uint64
  2. C#如何使用REST接口读写数据
  3. css中那些容易被我们程序猿所忽略的选择器
  4. 【深度学习】基于深度学习的目标检测研究进展
  5. .编写一个函数实现n^k,使用递归实现
  6. POJ 1061 BZOJ 1477 Luogu P1516 青蛙的约会 (扩展欧几里得算法)
  7. python求50的阶乘_python中求阶乘
  8. JavaScript-打开新窗口(window.open)
  9. 协程与线程, 进程的区别
  10. NHibernate学习之五:三种常见的配置方法。
  11. Windows7中右键菜单无新建文本文档选项的解决办法(注册表)
  12. Maven 本地仓库明明有jar包,pom文件还是报错解决办法(Missing artifact...jar)
  13. 拓端tecdat|R语言时间序列数据指数平滑法分析交互式动态可视化
  14. Android studio 报错 Gradle sync failed 你的主机中的软件中止了一个已建立的连接
  15. java 多线程高级面试_15个顶级Java多线程面试题及答案
  16. Java读取Rinex 2.11格式的观测值o文件
  17. 固态硬盘与普通硬盘有哪些区别?
  18. c语言strlen转义字符,转义字符 sizeof strlen
  19. vue+echarts+springboot实现云词图
  20. kaggle:NBA球员投篮数据分析与可视化

热门文章

  1. mac地址容量的作用_MAC地址理论知识与配置步骤
  2. 多目标跟踪(MOT)入门介绍
  3. SD 信用模拟检查增强
  4. 计算机双证在职博士,获得双证在职博士的难易度分析!
  5. ug齿条插件_UG8.0中怎么画齿条?
  6. 《Python编程无师自通》读书笔记
  7. 《安卓最佳免费应用》
  8. 云服务器DDOS攻击如何防御
  9. 扒一扒编程语言排行榜
  10. 使用JProfiler排查内存溢出(OOM)