• 高并发关于微博、秒杀抢单等应用场景在PHP环境下结合Redis队列延迟入库


    第一步:创建模拟数据表.

    CREATE TABLE `test_table` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `uid` int(11) NOT NULL DEFAULT '0' COMMENT '模拟用户id',
      `username` varchar(200) NOT NULL DEFAULT '' COMMENT '用户名',
      `content` varchar(200) NOT NULL DEFAULT '' COMMENT '内容',
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8

    第二步:来一个随机生成字符串的函数,模拟用户名与内容.

    function getStr($length) {
        $chars = array('a','b','c','d','e','f','g','h',
        'i','j','k','l','m','n','o','p','q','r','s',
        't','u','v','w','x','y','z','A','B','C','D',
        'E','F','G','H','I','J','K','L','M','N','O',
        'P','Q','R','S','T','U','V','W','X','Y','Z',
        '0','1','2','3','4','5','6','7','8','9','!',
        '@','#','$','%','^','&','*','(',')','-','_',
        '[',']','{','}','<','>','~','`','+','=',',',
        '.',';',':','/','?','|'); 
        $str = '';
        $count = count($chars);
        for($i=0;$i<$length;$i++){
            $str.= $chars[rand(0,$count-1)];
        }
      return $str;
    }

    第三步:在配置完成php_redis扩展的情况下,写一个并发脚本,同时把500条数据放入redis队列。

    $redis = new Redis();  
    $redis->connect('127.0.0.1', 6379);  
    $info= array(  
        'uid' => rand(1,3000),    //会员uid  
        'username' => getStr(8),    //会员名username 
        'content' => getStr(30),    //内容 
    );  
    $list = json_encode($info);   //将数组转成json来存储  
    $redis->lpush('list',$list);     //lpush向list链表对应的头部添加一个字符串元素  
    $redis->close();

    来用Apache的ab.exe并发测试写入,不懂得怎么用ab的看一下这篇文章:简单模拟一下ab压力测试

    测试写入队列500条数据,然后在Redis客户端用命令:lrange list 0 500 查看一下

    第四步:再来一个实时脚本把Redis队列里的数据延迟写入数据库。

    set_time_limit(0); // 取消脚本运行时间的超时上限  
    $redis = new Redis();  
    $redis->connect('127.0.0.1', 6379);   
    while (true) {  
        //返回的列表的大小。如果列表不存在或为空,该命令返回0。如果该键不是列表,该命令返回false  
        if($redis -> lsize('list')){  
            //从LIST头部删除并返回删除数据  
            $info = $redis->rpop('list');  
            $info = json_decode($info,true);  
            @$mysql      = mysql_connect('localhost','root','');
    mysql_query('SET NAMES utf8');
    mysql_select_db('test_db');
    $sql = "INSERT INTO test_table(`uid`,`username`,`content`)values ('".$info['uid']."','".$info['username']."',
    '".$info['content']."')";
    mysql_query($sql);
        }  
        usleep(300);//延时300毫秒  
    }  
    $redis->close();

    第五步:执行入库文件,然后查看数据库数据。(项目中要把入库脚本加入后台执行)

    完毕,大概思路就是这样的,项目中举一反三,当然解决的方案有很多。大家尽情思考~

     

  • 相关阅读:
    SpringCloud 天气预报系统 Quartz集成
    阿里云maven镜像库配置(gradle,maven)
    天气接口
    spring boot @ConditionalOnxxx相关注解总结
    为什么不应该使用ZooKeeper做服务发现
    Spring cloud系列十四 分布式链路监控Spring Cloud Sleuth
    Spring Cloud Sleuth Zipkin
    Spring Cloud Sleuth Zipkin
    标签系统
    简述 OAuth 2.0 的运作流程
  • 原文地址:https://www.cnblogs.com/wt645631686/p/6868843.html
Copyright © 2020-2023  润新知