redis中list模拟案例-消息队列

redis 数据类型:字符串string、list、set、zset、hash

主要的是list消息队列

消息队列的概念:先进先出

<?php
//echo phpinfo();
ini_set('display_errors','On');
error_reporting(E_ALL);
//连接本地的 Redis 服务
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
print_r($redis);
echo "<br/>Connection to server sucessfully<br/>";
//查看服务是否运行
echo "Server is running: " . $redis->ping();
echo '<hr/>';
//list  消息队列
/*echo $redis->llen('name');
echo $redis->lpop('name');
echo $redis->llen('name');*/

//高压力情况,不能高压力情况
for($i=0;$i<20;$i++){
    $uid = rand(100,3000);

    $redis_name = 'miaosha';
    //$uid = $_GET['uid'];
    $num = 10;

    if($redis->llen($redis_name)<10){
        $redis->rpush($redis_name,$uid.'%'.microtime());
        echo $uid.'秒杀成功<br/>';
    }else{
        echo '秒杀失败';
    }
}
$redis->close();
?>

<?php
ini_set('display_errors','On');
error_reporting(E_ALL);
//连接本地的 Redis 服务
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
ini_set("max_execution_time", 100);
//$db = DB::getLntance();
$redis_name = 'miaosha';
//死循环
$i=0;
while($i<15){
    $i++;
    //从队列最左侧取出一个值来,然后判断这个值是否存在
    $user = $redis->lpop($redis_name);
    //var_dump($user);exit;
    if(!$user || $user=='nil'){
        sleep(2);
        continue;
    }
    //切割出时间,uid,保存数据库中
    $user_arr = explode('%',$user);
    $arr = [
            'uid' => $user_arr[0],
            'time_stamp' => $user_arr[1]
        ];
    $_user[] = $arr;
    //数据库插入的失败的时候回滚机制
    if(!$_user){
        $redis->rpush($redis_name,$user);
    }
    sleep(2);
}

var_dump($_user);
//释放redis
$redis->close();

?>

posted @ 2017-07-21 20:17  玲汐  阅读(228)  评论(0编辑  收藏  举报