笔记

PHP redis秒杀场景队列使用

2019-08-03  本文已影响11人  vins

1:将用户加入队列

<?php
    $redis = new Redis();
    $redis->connect('127.0.0.1',6379);
    $redisName = "miaosha";

    for($i = 0; $i < 100; $i++){
            //接收用户的uid
            $uid = rand(1,999999);
            //规定抢购的数量
            $num = 10;
            //如果少于10则加入这个队列
            if($redis->lLen($redisName) < 10){
                    $redis->rPush($redisName,$uid.'%'.microtime());
                    echo $uid."秒杀成功"."<br>";
            }else{
                    echo "秒杀已经结束"."<br>";
            }
    }
    $redis->close();
?>

2.停止秒杀活动 操作队列将信息刷到mysql中

<?php
$dbms='mysql';     //数据库类型
$host='localhost'; //数据库主机名
$dbName='test';    //使用的数据库
$user='root';      //数据库连接用户名
$pass='123456';          //对应的密码
$dsn="$dbms:host=$host;dbname=$dbName";
$dbh = new PDO($dsn, $user, $pass);
$redis = new Redis();
$redis->connect('127.0.0.1',6379);
$redisName = "miaosha";

//死循环
while(1){
        //队列左侧取值
        $user = $redis->lPop($redisName);
        //判断值是否存在
        if(!$user || $user == 'nil'){
                sleep(2);
                continue;
        }
        //切割时间
        $userArr = explode('%',$user);
        $uid = $userArr[0];
        $time = date("Y-m-d H:i:s",time());
        $res = $dbh->query("INSERT INTO redis (id,uid,time) VALUES (NULL,$uid,'$time')");
        //如果失败  丢回队列
        if(!$res){
                $redis->rPush($redisName,$uid);
        }
        sleep(2);

}
//释放redis
$redis->close();

上一篇下一篇

猜你喜欢

热点阅读