数据库_Redis 入门基础到高级
程序员文章站
2022-04-28 13:57:22
一、PHP消息队列实现及应用 二、消息队列的优缺点 三、消息队列的配置和准备工作 案例如下: 下面是队列表字段及属性 四、Mysql订单队列 1、接受订单,并写入数据 order.php 2、队列系统处理队列中的订单并进行标识goods.php 3、定时任务。每分钟执行一次goods.sh 要会sh ......
一、php消息队列实现及应用
二、消息队列的优缺点
三、消息队列的配置和准备工作
案例如下:
下面是队列表字段及属性
四、mysql订单队列
1、接受订单,并写入数据 order.php
<?php //这个文件是用来接受用户的订单信息并写入队列的一个文件 //引入数据库链接类 include '../include/db.php'; //当接收到用户手机号不为空的时候 if(!empty($_get['mobile'])){ //这里首先是订单中心的处理流程 //因为订单系统是个单独的流程 这里需要处理 //...... 这里不单独写了 //把用户提交的数据进行过滤,防止sql注入 //直接假设个订单号 $order_id = rand(10000,99999); //生成订单信息 $insert_data = array( 'order_id'=>$order_id, 'mobile'=>$_get['mobile'], 'created_at'=>date('y-m-d h:i:s',time()), 'status'=>0,//0未处理 1已处理2处理中 ); //把订单信息存入到队列表中 $db = db::getintance();//此处是操作数据库,注意不同的框架有相应的内置的操作方法 $res = $db->insert('order_queue',$insert_data);//insert($table,$data) if($res){ echo '插入成功'; }else{ echo '插入失败'; } }
2、队列系统处理队列中的订单并进行标识goods.php
<?php //这个文件主要是配送系统处理队列中的订单并进行标记的一个文件 //加载数据库操作类 include '../include/db.php'; //初始化 $db = db::getintance(); //1:先把要处理的记录更新为等待处理(此处要锁定订单,防止处理未完成便被取用) $waiting = array(‘status’=>0);//等待处理的数据 $lock = array(‘status’=>2);//锁定的数据 $res_lock = $db->update('order_queue',$lock,$waiting,2);//update($table,$data,$where,$limit=0) //2:选择出刚刚更新的数据,然后进行配送系统的处理 if($res_lock){ //选择出要处理的订单的内容 $res = $db->selectall('order_queue',$lock);// //然后由配货系统进行配货处理 //......//此处是配货系统 //3:把处理过的程序更新为已完成 $success = array( 'status'=>1,//已完成 'updated_at'=>date('y-m-d h:i:s',time()), ); $res_last = $db->update('order_queue',$success,$lock); if($res_last){ echo 'success'.$res_last; }else{ echo 'fail'.$res_last; } }else{ echo 'all finished'; }
3、定时任务。每分钟执行一次goods.sh 要会shell基础
#!/bin/bash date "+%g-%m-%d %h:%m:s" cd /home/html/ssggw/queue_mysql/ php goods.php
4、在服务器部署下定时任务crontab -e
为了方便看结果,把定时任务结果输出到日志文件中,设定为标准输出,命令如下
执行命令保存文件:wq
新建日志文件命令
touch /home/html/ssggw/log.log
监控日志文件
数据库中已经成功两条数据
数据库中已经成功四条数据
解耦案例结束
五、redis
六、redis队列实现秒杀
1、创建数据表 redis_queue
2、接受用户请求的程序user.php
<?php //先加载redis组件 $redis = new redis(); $redis->connect('127.0.0.1',6379); $redis_name = "miaosha"; //接受用户id $uid = $_get['uid']; //获取下redis里面已有的数量 $num = 10;//秒杀前10个 //如果当天人数少于10的时候,则加入这个队列 if($redis->llen($redis_name)<10){ $redis->rfush($redis_name,$uid.'%'.microtime());//将用户uid(连接一个微妙)加入$fredis_name这个队列的尾部 echo "秒杀成功"; }else{ //如果当天人数已经达到了10个人,则返回秒杀已完成 echo "秒杀已结束"; } //关掉redis链接 $redis->close();
3、处理程序,即报数据写入mysql对应数据表savetodb.php
<?php //引入操作数据库类 include '../include/db.php'; //加载redis组件 $redis = new redis(); $redis->connect('127.0.0.1',6379); $redis_name = "miaosha"; $db = db::getlntance(); //死循环 while(1){ //从队列最左侧取出一个值来 $user = $redis->ipop($redis_name); //然后判断这个值是否存在 if(!$user || $user =='nil'){ //减少服务器压力 每1秒执行一次 真正的秒杀时间会很短,不用设置 sleep(1); //跳出循环 continue; } //切割出时间,uid $user_arr = explode('%',$user); //定义一个数组 $insert_data = array( 'uid'=>$user_arr[0], 'time_stamp'=>$user_arr[1], ); //保存到数据库中 $res = $db->insert('redis_queue',$insert_data); //数据库插入失败的时候的回滚机制 if(!$res){ $redis->rpush($redis_name,$user); } } //释放一下redis $redis->close();
测试
访问user.php文件url
结果
数据库表情况
上一篇: 轮椅王