首页 > 技术文章 > redis消息队列,tp5.0,高并发,抢购

songxuan 2018-09-27 10:59 原文

redis处理抢购,并发,防止超卖,提速

1.商品队列(List列表),goods_list           控制并发,防止超卖

2.订单信息(Hash集合),order_info          存放订单信息,后续处理

3.购买成功用户(Set集合),exist_list        set集合唯一性,防止用户重复购买

首先商品入库,存放redis列表

public function ruhuo(){
        $redis = new \redis();
        $redis->connect('127.0.0.1', 6379);
        for ($i = 1; $i <= 1000; $i++) {
            $redis->lpush('goods_list', $i);
        }
    }

抢购

public function 抢购(){
        $redis = new \Redis();
        $redis->connect('127.0.0.1', 6379);

        //通过查看 队列的长度来判断,货物是否被抢购完
        if($redis->lLen('goods_list')==0){
            return '已经卖完';
        }

        //获取用户 id
        $user_id=input('post.id');

        //通过 集合的唯一性,判读此用户是否已经购买
        if($redis->sIsMember('exist_list',$user_id)){
            return '你已经购买过了!';
        }
        //从商品队列删除一个商品,并获取值为商品 id
        $goods_id = $redis->rpop('goods_list');

        //订单信息
        $goods_info = array(
            'user_id'  =>$user_id,
            'goods_id' =>$goods_id,
            'time'     =>time(),
            ...
        );

        //订单信息暂存 redis 哈希表,后续处理
        $redis->hSet('order_info',$user_id,json_encode($goods_info));
        return '购买成功';
    }

 

推荐阅读