php-redis队列实现抢购商品

原创 2017年06月14日 09:17:50

公司业务,为了对抗高并发业务,使用redis队列机制,大家可以一起参考参考

1,用户点击某个商品,首先进入的是商品详情页面,这时候我们将商品库存进行入队列

  

private $user_queue_key;
private $goods_number_key;
private $user_id;
private $goods_id;

public function __construct(){
    $this->x_pi = 3.14159265358979324 * 3000.0 / 180.0;
    parent::__construct();
    $goods_id = intval($_GET['goods_id']);
    $area_id  = intval($_GET['area_id']);
    if($goods_id){
        $this->goods_id = $goods_id;
        $this->user_queue_key = "goods_".$goods_id."_user";//当前商品队列的用户情况
        $this->goods_number_key = "goods".$goods_id;//当前商品的库存队列
    }
    $this->user_id = $this->user_id ? $this->user_id : $_SESSION['wap_member_info']['userid'];
}


/*******************判断商品库存够不够,进行队列*************************/
/*******************当天库存数量是否大于当天下单量订单数量******/
$member_id = $this->user_id;
$m     = Model('order');
$redis = new Redis();
$redis->connect(C('redis.master.host'), C("redis.master.port"));
$goods_orders     = $m->getOrderAndOrderGoodsLists($goods_detail['goods_info']['goods_id']);
$order_count      = count($goods_orders);
if($goods_detail['goods_info']['goods_storage'] > $order_count){
    /*队列*/
    $getUserRedis = $redis->hGetAll("{$this->user_queue_key}");
    $gnRedis = $redis->llen("{$this->goods_number_key}");
    /* 如果没有会员进来队列库存 */
    if(!count($getUserRedis) && !$gnRedis){
        for ($i = 0; $i < $goods_detail['goods_info']['goods_storage']; $i ++) {
            $redis->lpush("{$this->goods_number_key}", 1);
        }
    }
    $resetRedis = $redis->llen("{$this->goods_number_key}");
    if(!$resetRedis){
        return callback(false, '系统繁忙,请稍后抢购!');
    }
}else{
    return callback(false, '当前商品已经卖完!');
}
/*******************判断商品库存够不够,进行队列*************************/
/*******************当天库存数量是否大于当天下单量订单数量******/
2,当用户点击立即购买按钮的时候,将该商品用户进行队列

/*******************抢购商品前处理当前会员是否进入队列*************************/
$res = $this->goods_number_queue($result, $member_id);
if($res == 1){
    return callback(false, ',您已进入购买排队,请重试!');
}else{
    /*******************抢购商品前处理当前会员是否进入队列*************************/
    if(!$result['state']){
        return $result;
    }
    //得到页面所需要数据:收货地址、发票、代金券、预存款、商品列表等信息
    $result = $this->getBuyStep1Data($member_id, $result['data']);
    return $result;
}

/**
 * 抢购商品前处理当前会员是否进入队列
 * @access public
 * @author bieanju
 */
public function goods_number_queue($result, $member_id){
    $redis = new Redis();
    $redis->connect(C('redis.master.host'), C("redis.master.port"));
    foreach($result['data']['goods_list'] as $k => $v){
        /*进入队列*/
        $goods_number_key  = "goods" . $v['goods_id'];//当前商品的库存队列
        $user_queue_key    = "goods_" . $v['goods_id'] . "_user";//当前商品队列的用户情况
        $goods_number_keys = $redis->llen("{$goods_number_key}");
        if(!$redis->hGet("{$user_queue_key}", $member_id)){
            $goods_number_keys = $redis->lpop("{$goods_number_key}");
        }
        if($goods_number_keys){
            // 判断用户是否已在队列
            if(!$redis->hGet("{$user_queue_key}", $member_id)){
                // 插入抢购用户信息
                $userinfo = array(
                    "user_id"     => $member_id,
                    "create_time" => time()
                );
                $redis->hSet("{$user_queue_key}", $member_id, serialize($userinfo));
                return 1;
            }else{
                //获取购物车栏
                return 2;
            }
        }else{
            output_error('系统繁忙,请重试!');
        }
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

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

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

基于PHP+redis的秒杀系统

PHP原生代码编写,没有基于框架,主要让用户了解秒杀原理。 github:https://github.com/sanjiOP/seckill seckill 秒杀系统 环境: 1...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

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

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

【高并发简单解决方案】redis队列缓存 + mysql 批量入库 + php离线整合 PHP解决抢购、秒杀

【高并发简单解决方案】redis队列缓存 + mysql 批量入库 + php离线整合 https://segmentfault.com/a/1190000004136250 PH...

redis处理库存问题

12月份重构公司社群活动产品,原来自己不是很成熟,按传统的形式处理卖票的信息-现在回首很多地方都会出问题。 先说下背景:业务是卖票!所以自然而然会遇到高并发下的库存问题 搜了很多网...

php redis 并发控制

针对并发控制可以使用 memcacheq ,redis channle 等方式处理 这里我单单的说一下redis 怎么去控制并发 redis控制并发主要采用 redis list api 中的 l...

通过请求队列的方式来缓解高并发抢购(初探)

通过请求队列的方式来缓解高并发抢购(初探)  原文:http://www.cnblogs.com/XiaoyangBoke/p/6701780.html 一、背景        在移动互联网高速...

高并发抢购思路

电商的秒杀和抢购,对我们来说,都不是一个陌生的东西。然而,从技术的角度来说,这对于Web系统是一个巨大的考验。当一个Web系统,在一秒钟内收到数以万计甚至更多请求时,系统的优化和稳定至关重要。这次我们...

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

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

Redis实现高并发下的抢购、秒杀功能

欢迎大家关注我的其他Github博客和简书,互相交流! 博主最近在项目中遇到了抢购问题!现在分享下。 抢购、秒杀是如今很常见的一个应用场景,主要需要解决的问题有两个: 1 高并发对数...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)