我的名片

网名:观海听潮

职业:PHP开发工程师

现居:山东省-青岛市

Email:1256699215@qq.com

当前访客

来自美国弗吉尼亚州的朋友,您好!

感谢您访问观海听潮 · 博客网站,祝您生活愉快!

您现在的位置是:首页  > IT文档  > redis  > php php

观海听潮

php redis实现高并发电商秒杀抢购功能

摘要
抢购/秒杀是如今很常见的一个应用场景,那么高并发竞争下如何解决超抢(或超卖库存不足为负数的问题)呢?

高并发产生的问题:

1、超卖:比如A商品库存是10个,在同一时间有100个用户去抢购这个商品,这个时候去判断库存是否充足,答案肯定是充足的。造成的问题就是会多卖了90个。

2、超抢:一般秒杀是一个用户只能抢一次。如果某平台没有对用户唯一性做限制,就是说在不同的设备上都可以登录这个平台,然后同时去抢这个商品,就会造成这个商品被同一个用户抢了多次。

redis优势:

1、redis队列方法:因为redis队列可以实现及时多个用户同时去请求,也会按顺序排列起来。是一种单线程模式。

2、redis哈希方法:hash可以根据用户id存储用户信息,并且每个用户id只存储一次。用来实现超抢问题。

解决方法:

1、提前将抢购商品存到redis队列中。

<?php $redis = new Redis(); $redis->connect('127.0.0.1', 6379); //商品A总库存量

A商品id:$goods_id;       库存:$num = 10;  

for($i=0;$i<10;$i++){

$redis->rpush('goods_store:'.$goods_id,1);

}

这个步骤可以放到秒杀开始前,比如写个定时去执行这个脚本,将所有秒杀商品库存都放到redis队列中

2、秒杀活动开始,用户开始抢购商品

<?php

$goods_id;//商品id

$user_id;//当前抢购用户id

$wait_key = "wait_user";//参与抢购的用户key

$user_key = "user";//实际抢到的用户key

$redis = new redis();       $redis->connect('127.0.0.1', 6379);

$store_key = "goods_store:1";

$goods_store = $redis->llen('goods_store:'.$goods_id);//当前商品的库存

$result =$redis->hset($wait_key, $user_id, $user_id);//将当前抢购用户存入redis,如果用户之前已经抢购过,result将返回0,否则是1

  if($result)

   {

//当前用户第一次抢购

if($goods_store==0){

echo '已经抢光了哦'.$user_id;

}else{

     $result =$redis->hset($user_key, $user_id, $user_id);//记录实际抢到商品的用户

$redis->lpop($store_key);

echo '恭喜您!抢到了哦'.$user_id;

}

    }else{

     echo '你已经抢过啦';

  }

参考链接:https://blog.csdn.net/qq_33862778/article/details/80651703


上一篇:ngnix配置https

下一篇:公众号基本配置

or 讨厌 (0)
微博logo QQ空间logo QQlogo 豆瓣logo 人人logo 百度贴吧logo 有道云笔记logo

文章评论

表情表情
×
图片图片

评论列表