高并发关于微博、秒杀抢单等应用场景在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();
第五步:执行入库文件,然后查看数据库数据。(项目中要把入库脚本加入后台执行)
完毕,大概思路就是这样的,项目中举一反三,当然解决的方案有很多。大家尽情思考~
高并发关于微博、秒杀抢单等应用场景在PHP环境下结合Redis队列延迟入库的更多相关文章
- 01 整合IDEA+Maven+SSM框架的高并发的商品秒杀项目之业务分析与DAO层
作者:nnngu 项目源代码:https://github.com/nnngu/nguSeckill 这是一个整合IDEA+Maven+SSM框架的高并发的商品秒杀项目.我们将分为以下几篇文章来进行详 ...
- [超简洁]EasyQ框架-应对WEB高并发业务(秒杀、抽奖)等业务
背景介绍 这几年一直在摸索一种框架,足够简单,又能应付很多高并发高性能的需求.研究过一些框架思想如DDD DCI,也实践过CQRS框架. 但是总觉得复杂度高,门槛也高,自己学都吃力,如果团队新人更难接 ...
- 02 整合IDEA+Maven+SSM框架的高并发的商品秒杀项目之Service层
作者:nnngu 项目源代码:https://github.com/nnngu/nguSeckill 首先在编写Service层代码前,我们应该首先要知道这一层到底是干什么的. Service层主要负 ...
- 03 整合IDEA+Maven+SSM框架的高并发的商品秒杀项目之web层
Github:https://github.com/nnngu 项目源代码:https://github.com/nnngu/nguSeckill 前端交互流程设计 对于一个系统,需要产品经理.前端工 ...
- 04 整合IDEA+Maven+SSM框架的高并发的商品秒杀项目之高并发优化
Github:https://github.com/nnngu 项目源代码:https://github.com/nnngu/nguSeckill 关于并发 并发性上不去是因为当多个线程同时访问一行数 ...
- MQ在高并发环境下,如果队列满了,如何防止消息丢失?
1.为什么MQ能解决高并发环境下的消息堆积问题? MQ消息如果堆积,消费者不会立马消费所有的消息,不具有实时性,所以可以解决高并发的问题. 性能比较好的消息中间件:Kafka.RabbitMQ,Roc ...
- 【总结】瞬时高并发(秒杀/活动)Redis方案(转)
转载地址:http://bradyzhu.iteye.com/blog/2270698 1,Redis 丰富的数据结构(Data Structures) 字符串(String) Redis字符串能包含 ...
- 【总结】瞬时高并发(秒杀/活动)Redis方案
1,Redis 丰富的数据结构(Data Structures) 字符串(String) Redis字符串能包含任意类型的数据 一个字符串类型的值最多能存储512M字节的内容 利用INCR命令簇(IN ...
- 大数据高并发系统架构实战方案(LVS负载均衡、Nginx、共享存储、海量数据、队列缓存)
课程简介: 随着互联网的发展,高并发.大数据量的网站要求越来越高.而这些高要求都是基础的技术和细节组合而成的.本课程就从实际案例出发给大家原景重现高并发架构常用技术点及详细演练. 通过该课程的学习,普 ...
随机推荐
- Java高级工程师——面试总结
面试技巧 1.背熟你的简历 原因:面试的第一个问题,一般都是让你简单介绍下你自己,或者介绍一下你最近的项目,而一个面试者,如果连自己的简历都无法熟知,对里面提到的项目.技术都无法描述清楚的话,我想没有 ...
- 数据存储之HTTP Cookie
Cookie (HTTP Cookie) 作用 HTTP本身是无状态的,客户端通过Cookie来存储会话信息 限制 cookie在性质上是绑定在特定域名下的 意思是说当设定了一个cookie之后,再给 ...
- common-logging--源码之SimpleLog
common-logging源码Log接口 在common-logging的源码中,将log核心类抽象成了一个Log接口. 这里贴出Log接口的源码: /* * Licensed to the Apa ...
- thinkphp5学习(一)——thinkphp5的目录结构与开发规范
开发规范: 目录和文件 目录使用小写+下划线: 类库.函数文件统一以.php为后缀: 类的文件名均以命名空间定义,并且命名空间的路径和类库文件所在路径一致: 类文件采用驼峰法命名(首字母大写),其它文 ...
- CentsOS7无网情况下安装mysql5.7
1.需求就不用讲了,客户现场,政府环境,银行环境,大多是没网的,所以无网安装是很有必要的 mysql下载路径:https://dev.mysql.com/downloads/mysql/ 查看自己Li ...
- 邮件报警(postfix)
postfix是Wietse Venema在IBM的GPL协议之下开发的MTA(邮件传输代理)软件.postfix是Wietse Venema想要为使用最广泛的sendmail提供替代品的一个尝试.在 ...
- 文字滚动效果,jquery和marquee标签
链接:https://pan.baidu.com/s/1pMwHYH1 密码:r9ys marquee标签是微软创建的,后来大部分浏览器都适用后,微软在IE8把这个标签去掉了.为符合W3C规范,还是使 ...
- copy-webpack-plugin最简使用示例
拷贝文件的插件 加载插件 $ npm install copy-webpack-plugin --save-dev API new CopyWebpackPlugin(patterns: Array, ...
- 已知有两个水杯,一个11L一个7L,水可以任意使用,求怎么得到2L 的详细解法
问题:有两个水杯,一个是11L一个是7L,水可以随便用,怎么得到2L 1.了解问题的本质 问题中给出了两个杯子,只有这两个杯子有量度,所以只能让杯中的水满进满出才能确定杯子中最后有多少水. 现在问题要 ...
- Core Animation 文档翻译—附录C(KVC扩展)
前言 关于CAAnimation和CALayer类,核心动画扩展了NSKeyValueCoding协议.这个扩展为一些keys添加了默认值,扩大了封装协议,添加了为CGpoint.CGRect.C ...