流程:
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'=>'系統繁忙,請重試');
}
}