详情访问个人网站:http://www.ouxiaoxian.top/?p=115
流程:
1.访问产品前先将当前产品库存队列(点击商品的时候,要将商品存入redis中)
2.处理当前会员是否进入队列(下单时候判断会员是否在redis队列中)
注:我做的是商品直播的时候秒杀,如果做整点秒杀,将下面的时间的start_time,end_time改成固定时间
// 将redis的信息封装函数
public function connectRedis()
{
$redis = new \Redis();
$redis->connect('127.0.0.1',6379);
$redis->auth('xinglian272');
return $redis;
}
/**
* 访问产品前先将当前产品库存队列 1.当前秒杀已经结束2.系统繁忙,请稍后再试3.当前产品已经秒杀完
* @access public
* wang
* 2019/3/9
*/
public function goods_redis($param){
$goods_id = $param['goods_id'];
if($goods_id){
$goods_list_user = "goods_".$goods_id."_user";//当前商品队列的用户情况
$goods_list_num = "goods".$goods_id;//当前商品的库存队列
}
$where['goods_id'] = $goods_id;
$where['start_time'] = array("lt",time());
$where['end_time'] = array("gt",time());
$goods = M("miao_goods")->where($where)->field('goods_num,start_time,end_time')->find();
// 判断时间是否满足条件
if(empty($goods)){
return array('Code' =>'0','Msg'=>'no','Data'=>'当前秒杀已经结束2');
}
// dump($goods_list_user);die;
if($goods['goods_num'] > $goods['order_num']){
$redis = $this->connectRedis();
$getUserRedis = $redis->hGetAll("$goods_list_user");
// dump(count($getUserRedis));die;
$gnRedis = $redis->llen("{$goods_list_num}");
/* 如果没有会员进来队列库存 */
if(!count($getUserRedis) && !$gnRedis){
for ($i = 0; $i < $goods['goods_num']; $i ++) {
$redis->lpush("{$goods_list_num}", 1);
}
}
$resetRedis = $redis->llen("{$goods_list_num}");
if(!$resetRedis){
return array('Code' =>'0','Msg'=>'no','Data'=>'系统繁忙,请稍后再试');
}
return array('Code' =>'0','Msg'=>'ok','Data'=>'成功');
}else{
return array('Code' =>'0','Msg'=>'no','Data'=>'当前产品已经秒杀完');
}
}
/**
* 抢购商品前处理当前会员是否进入队列
* @access public
* wang
*/
public function goods_number_order($param){
// $param['uid']='358';
$goods_id = $param['goods_id'];
if($goods_id){
$goods_list_user = "goods_".$goods_id."_user";//当前商品队列的用户情况
$goods_list_num = "goods".$goods_id;//当前商品的库存队列
}
// 判断用户是否有uid传入
if(empty($param['uid'])){
return array('Code' =>'0','Msg'=>'no','Data'=>'用户uid为空');
}
$model = M("miao_goods");
$where['goods_id'] = $goods_id;
$goods_info = $model->where($where)->find();
if(empty($goods_info)){return array('Code' =>'0','Msg'=>'no','Data'=>'对不起,当前商品不存在或已下架');}
/* redis 队列 */
$redis = $this->connectRedis();
/* 进入队列 */
$goods_number_key = $redis->llen("{$goods_list_num}");
if (!$redis->hGet("{$goods_list_user}", $param['uid'])) {
$goods_number_key = $redis->lpop("{$goods_list_num}");
}
if($goods_number_key){
// 判断用户是否已在队列
if (!$redis->hGet("{$goods_list_user}", $param['uid'])) {
// 插入抢购用户信息
$userinfo = array(
"user_id" => $param['uid'],
"create_time" => time()
);
$redis->hSet("{$goods_list_user}", $param['uid'], serialize($userinfo));
return array('Code' =>'0','Msg'=>'OK','Data'=>'成功');
}else{
// 如果redis存储了用户信息
return array('Code' =>'0','Msg'=>'OK','Data'=>'成功');
}
}else{
return array('Code' =>'0','Msg'=>'no','Data'=>'系统繁忙,请重试');
}
}