美文网首页
PHP使用Redis秒杀案例

PHP使用Redis秒杀案例

作者: ES_KYW | 来源:发表于2020-08-06 15:25 被阅读0次

PHP秒杀功能,需要解决超抢和多抢的问题,利用redis的单线程和集合数据不重复的特点可以较好的解决这两个问题

// 秒杀策略    ab -n 1000 -c 100 http://*****/Index/miao_sha
    static $redis = null;
public function miao_sha(){
    if (!$redis) $redis = new \Think\Cache\Driver\Redis;

    // 随机生成用户
    $user_id = rand(0,1000);

    // 修改$rad_id 便于多次测试
    $rad_id = '11';

    // 如果是第一次访问,设置库存订单数据
    $has_set_order = $redis->get('has_set'.$rad_id);

    // 用户等待集合,使用集合防止同一个用户多次访问
    $user_wait_key = "user_wait".$rad_id;

    // 保存抢购成功的用户
    $user_key = "user".$rad_id;

    // 库存队列
    $store_key = "goods_store".$rad_id;

    if (!$has_set_order){

        $redis->set('has_set'.$rad_id,1);
        $num = 100;
        for ($i=0;$i<$num;$i++){
            $redis->rPush($store_key,'1');
        }
    }

    // 集合 防止多抢和超抢  redis队列可以防止多并发超抢,因为redis是单线程,使用集合防止存储重复用户id
    $result = $redis->sAdd($user_wait_key,$user_id);
    if ($result){
        // 取出库存中的数据
        $count = $redis->lpop($store_key);
        if (!$count){
            echo  '已经抢光'.$user_id;
        }else{
            $redis->hset($user_key,$user_id,$user_id);
            echo '恭喜您抢到了'.$user_id;
        }
    }
// list 会出现同一个用户抢到多个的情况。会出现同一个用户多次抢到的情况,ab命令行并发执行
//        $result = $redis->rPush($wait_key,$user_id);
//        if ($result){
//            $count = $redis->lpop($store_key);
//            if (!$count){
//                echo  '已经抢光了哦'.$user_id;
//            }else{
//                $result = $redis->rPush($user_key,$user_id);
//                echo '恭喜您抢到了'.$user_id;
//            }
//        }
}

// 获取秒杀信息
public function get_ms_info(){
    static $redis = null;
    if (!$redis) $redis = new \Think\Cache\Driver\Redis;
    $rad_id = '11';
    $user_key = "user".$rad_id;
//  die(json_encode(($redis->lGetRange($user_key,0,-1))));
    die(json_encode(($redis->hGetAll($user_key))));
}

相关文章

网友评论

      本文标题:PHP使用Redis秒杀案例

      本文链接:https://www.haomeiwen.com/subject/ddanrktx.html