2018-07-02 15:35:42消息队列介绍及应用场景demo
您现在的位置是: 首页 > php > 消息队列介绍及应用场景demo
核心结构:
业务系统--(入队)--》消息队列--(出对)--》队列处理系统
应用场景:
冗余 解耦 削峰案例 异步通信
扩展性 排序保证
消息队列优缺点:
mysql(mysql订单队列) 可靠性高 易实现 速度慢
redis 速度快 单条大消息包时效率低
消息系统:专业性强 可靠 学习成本高
消息处理触发机制
死循环方式读取:易实现,故障时无法及时恢复
定时任务:压力均分 有处理量上限
解耦案例
架构设计
1.1订单系统接受用户订单 ----》订单列表----》配送系统和标记配送结构
2.2程序流程
接受用户订单---》订单系统---》队列表(order_id,status,address,create)time,update_time)---》配送处理系统goods.php(需要一个定时脚本goods.sh)----》配送系统
流量削峰案例(分流 解压 中间键 )
redis 的list 类型实现秒杀
特点:秒杀就是瞬间有巨大的访问量
不用mysql做秒杀的原因:
myslq需要往硬盘里面写,redis基于内存,而且其他业务也可能使用mysql,如果秒杀使用mysql,那瞬间的流量会把mysql资源耗光,造成mysql死锁。redis会不定期把数据写到硬盘里,不用担心断电的问题。
redis 提供5中类型 双向链表(有序集合):
LPUSH/LPUSHX 将值插入到/(存在的)列表头部
RPUSH/RPUSHX 将值插入到/存在的列表尾部
LPOP 移出并获取列表的第一个元素
RPOP移出并获取列表的最后一个元素
ltrim 保留指定区间内的元素
LIEN 获取列表长度
LSET 通过索引设置列表元素的值
LINDEX 通过索引获取列表中的元素
LRANGE 获取列表制定范围内的元素
架构设计:
秒杀业务程序(标明那个用户,和时间)
---》redis
--》入库程序
---》数据库
代码及设计
1.秒杀程序把请求写入redis(uid,time_stamp微秒时间戳)
2.检查redis已存入数据的长度,超出上限直接丢弃
3.死循环处理存入redis的数据并入库
实现:
存入redis:
先加载redis组件
$redis = new Redis();
$redis->connect(ip);
$redis_name='miaosha';
接受用户uid
$uid = $_GET['uid'];
获取一个redis里面已经有的数量
$num = 10;
如果当天人数少于10的时候,加入队列
if($redis->ILen($reids_name) < 10){
$redis->rFlush($redis_name,$uid.'%'.microtime())
echo '秒杀成功';
}{
返回秒杀已完成
}
$redis->close();
处理程序,写入数据库:
加载redis组件
//死循环
从队列最左侧取出一个值来,然后判断这个值是否存在,切割出时间,uid,保存到数据库中,数据库插入失败的时候回滚机制 ,释放redis
whlie(1){
$user = $redis->IPop($redis_name)//左侧取值
if(!$user || $user == 'nil'){
sleep(2);
continue;
}
$user_arr = explode('%',$user);
$insert_data = arraya(
'uid'=>$user_arr[0];
'time'=>$user_arr[1];
//入库操作 insert $res
if(!$res){
$redis->rPush($redis_name,$user);
}
);
}
$redis->close();
如何在服务器使用:
先 cd 到需要执行的文件目录,ls确认
php savetodb.php
关键字词: 消息队列介绍demo,消息队列应用场景demo
上一篇: ajax总结
下一篇: php数据库操作封装类包含事务回滚