最新消息:欢迎加入小松的QQ群一起讨论一起学习,搜索页面修改成lua+ElasticSearch,使用php这个页面速度相对慢一点,优化之后速度杠杠的,如有问题请加群联系我

电商秒杀系统的设计

PHP 142浏览 0评论

redis

最近公司这里要配合支付宝做一个秒杀系统,于是查了相关的资料,
秒杀系统的问题
1)短时间内服务负载高
2)高并发超卖的问题

百度搜索的结果
下面的方法都使用redis即代码

$redis = new \Redis();

if ($redis->connect('127.0.0.1','6379') == false) {
    die($redis->getLastError());
}

①使用redis的原子性操作,保证不多抢

if($_GET['flag']){
    $redis->set('flag',10);exit;
}

$key_r = $redis->decr('flag');//利用redis的原子性操作,保证不多抢
if ($key_r < 0) {
    

} else {
    //抢到了
    $value="test".rand("1","20");
    $redis->zAdd('demo',$redis->get('flag'),$value);
    $rs=$redis->zRange('demo',0,-1);
    //print_r($key_r);
    if(count($rs)+$key_r<10){
        $redis->set('flag',$key_r+1);
    }
}

②先把商品放到队列,减队列的方式

if($_GET){
    $store=10; 
    $res=$redis->llen('goods_store');  
    echo $res;  
    $count=$store-$res;  
    for($i=0;$i<$count;$i++){  
        $redis->lpush('goods_store',1);  
    }
    $redis->set('flag',10);
    exit;
}  


$count=$redis->lpop('goods_store');  
if(!$count){  
    insertLog('error:no store redis');  
    return;  
}else{
    $value="test".rand("1","20");
    $redis->zAdd('demo',$redis->get('flag'),$value);    
}

③慕课网看视频提供的方法

if(!$redis->get('flag')){
    $redis->set('flag',1);
}

$value="test".rand("1","20");
if($redis->get('flag')>10){


}else{

    if($redis->zAdd('demo',$redis->get('flag'),$value)){
        $redis->incr("flag");
    }
}

上面的方法都用办法测试过

ab -n 1000 -c 1000 http://127.0.0.1/redis.php

都有问题
②③都出现超卖的情况
① 不会出现超卖会出现少买的情况

QQ交流群:136351212

如无特别说明,本站文章皆为原创,若要转载,务必请注明以下原文信息:
转载保留版权:小松博客» 电商秒杀系统的设计
本文链接地址:https://www.phpsong.com/2901.html

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
木有头像就木有JJ!点这里按步骤申请Gravatar头像吧!

网友最新评论 (2)

加载中,请稍候...
  1. 老师好,我试了一下,总数达到10000就不行了,不能全部执行完毕,怎么解决?
    lulu18小时前回复
    • 你的问题描述不清楚
      小松7秒前回复