高并发关于微博、秒杀抢单等应用场景在PHP环境下结合Redis队列延迟入库
2017-05-17 18:05
991 查看
第一步:创建模拟数据表.
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的看一下这篇文章:http://www.901018.wang/51
测试写入队列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();
第五步:执行入库文件,然后查看数据库数据。(项目中要把入库脚本加入后台执行)
完毕,大概思路就是这样的,项目中举一反三,当然解决的方案有很多。大家尽情思考~
相关文章推荐
- 【高并发简单解决方案】redis队列缓存 + mysql 批量入库 + php离线整合 PHP解决抢购、秒杀
- 【高并发简单解决方案】redis队列缓存 + 批量入库 + php离线整合
- php结合redis高并发下发帖、发微博的实现方法
- php结合redis实现高并发下的抢购、秒杀功能
- php结合redis高并发下发帖、发微博
- (高级篇)php结合redis实现高并发下的抢购、秒杀功能
- php结合redis实现高并发下的抢购、秒杀功能
- php结合redis实现高并发下的抢购、秒杀功能
- 【高并发简单解决方案】redis队列缓存 + mysql 批量入库 + php离线整合
- PHP结合redis实现秒杀活动大并发
- php结合redis实现高并发下的抢购、秒杀功能
- php结合redis实现高并发下的抢购、秒杀功能
- php结合redis实现高并发下的抢购、秒杀功能
- php结合redis实现高并发下的抢购、秒杀功能 (转载)
- php结合redis高并发下发帖、发微博的实现方法
- php结合redis实现高并发下的抢购、秒杀功能
- php结合redis实现高并发下的抢购、秒杀功能
- php结合redis实现高并发下的抢购、秒杀功能
- 【高并发简单解决方案】redis队列缓存 + mysql 批量入库 + php离线整合
- 【高并发简单解决方案】redis队列缓存 + 批量入库 + php离线整合