消息队列 秒杀实现 redis 高并发 定时任务
2018-08-09 09:36
776 查看
版权声明:xuhaha©2018 https://blog.csdn.net/weixin_42793426/article/details/81530791
消息队列
概念
(流程中间件 ,2个或者多个系统场景有优势)
-
队列结构的中间件
-
消息放入后,不需要立即处理
-
由订阅者/消费者按顺序处理
原理
业务系统(入队)->消息队列->(出队)队列处理系统
场景
-
数据冗余(持久化存储在队列中 由订单程序进行处理 存储每个记录处理完成)
-
系统解耦 订单系统和配送系统
mysql 订单队列 队列表 id(11) order_id(11),mobile(vch20),created_at(datetime),status(tinyint(2))
一个文件用于接受用户订单信息并写入队列的一个文件(order.php)
1.将用户传过来的数据进行过滤 (防止mysql注入)
2.生成的订单信息存入队列表中
3.把数据存放到队列表中
主要是配送系统处理队列中的订单进行标记的文件(goods.php)
先把要处理的记录更新为等待处理
$waiting = array('status'=>0) $lock =array('status'=>2) $res =update('duilie',$lock,$waiting);
-
我们要选择出刚刚我们更新的这些数据,进行配送系统的处理
if($res){ //选择出处理的订单内容 $res=$db->selectAll('duilei',$lock); //然后由配货系统进行退货处理 ....... }
-
把这些处理过的程序更新为已完成
$arr =array( 'status'=>1, 'updated_at'=>date('y-m-d h:i:s',time()); )
定时脚本(goods.sh)
crontab -e 命令
每分钟执行一次
#m h dom mon dow command
分 时 日 月 周 执行的命令
*/1 * * * * /home/sites/goods.sh >> /home/log.log 2>&1 把结果输出日志文件中并转换标准输出
tail -f log.log 监控日志文件
#!/bin/bash date"+%G-%m-%d %H:%M:S" cd 写goods.sh的目录(/home/sites/) php goods.php
流量削峰 list类型实现秒杀
秒杀表 id(int10),uid(int11),time_stamp(vach24)
user.php
加载redis组件 $redis = new Redis(); $redis->connect('127.0.0.1',6379); $redis_name="miaosha"; 高压力测试 for($i=0;$i<100;$i++){ $uid = rand(100000,999999); } 接收用户uid $uid =$_GET['uid']; 获取redis里面已有是数量 $num =10; 如果当前人数少于10,则加入队列 if($redis->lLen($redis_name) <10) { $redis->rPush($redis_name,$uid.'%'.microtime()); }else { 达到10人,输出秒杀结束 echo '秒杀结束'; } $redis->clsoe();
save.php
死循环 while(1) { //从队列最左侧取出一个值 $user =$redis->lPop($redis_name); //然后判断这个值是否存在 if(!$user || $user =='nil') { sleep(2); continue; } } 切割出时间,uid $user_arr = explode('%',$user); $insert_data = array( ) 保存到数据库中 数据插入失败时候回滚机制 释放redis
-
异步通信
-
排序保证
-
扩展性
队列优缺点
队列介质
-
mysql :可靠性高,意实现,速度慢
-
redis:速度快,单条大消息包时效率低
-
消息系统:专业性强,可靠,学习成本高
消息处理触发机制
-
死循环方式读取:易实现,故障时无法及时恢复
-
定死任务:压力均分,有处理量上限
-
守护进程:类似于php-fpm和php-cg,需要shell基础
lpush/lpushx 将值插入到存在的列表头部
RabbitMQ 更专业的消息系统实现方案 (复杂逻辑项目)
阅读更多相关文章推荐
- PHP中利用redis实现消息队列处理高并发请求
- redis 实现消息队列,秒杀功能实现小测试
- PHP中利用redis实现消息队列处理高并发请求--简洁代码实现效果
- 使用NODEJS+REDIS开发一个消息队列以及定时任务处理
- spring boot-使用redis的Keyspace Notifications实现定时任务队列
- PHP中利用redis实现消息队列处理高并发请求
- PHP消息队列实现及应用:流量削峰案列(Redis的List类型实现秒杀)
- php+redis消息队列实现抢购功能
- Redis在高并发的情况下实现秒杀的原理
- 利用主线程与子线程间的消息通讯,实现任务处理队列.子线程中创建不会阻塞执行的窗口
- 用redis实现消息队列
- php结合redis实现高并发下的抢购、秒杀功能
- 利用线程消息队列,实现任务队列
- redis实现有序的消息队列
- Java Jedis操作Redis示例(二)——list 生产者/消费者模式实现消息队列
- Redis与RabbitMQ实现消息队列
- Redis实现高并发下的抢购、秒杀功能
- 利用redis实现带优先级的消息队列
- 高并发关于微博、秒杀抢单等应用场景在PHP环境下结合Redis队列延迟入库
- Redis实现简单消息队列