数据库_Redis 入门基础到高级
一、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

结果

数据库表情况

数据库_Redis 入门基础到高级的更多相关文章
- mybatis入门基础(六)----高级映射(一对一,一对多,多对多)
一:订单商品数据模型 1.数据库执行脚本 创建数据库表代码: CREATE TABLE items ( id INT NOT NULL AUTO_INCREMENT, itemsname ) NOT ...
- 《MySQL数据库从入门到精通》 高级运维人才的必备书籍
众所周知,每年就业市场都会迎来千万量级的高校毕业生,然而企业招工难和毕业生就业难的矛盾却一直没有得到很好地解决.究其原因,主要矛盾还是在于传统的学历教育与企业实际需求相脱节.为了杜绝高校毕业生求职时常 ...
- Python学习入门基础教程(learning Python)--5.6 Python读文件操作高级
前文5.2节和5.4节分别就Python下读文件操作做了基础性讲述和提升性介绍,但是仍有些问题,比如在5.4节里涉及到一个多次读文件的问题,实际上我们还没有完全阐述完毕,下面这个图片的问题在哪呢? 问 ...
- HTML入门基础教程相关知识
HTML入门基础教程 html是什么,什么是html通俗解答: html是hypertext markup language的缩写,即超文本标记语言.html是用于创建可从一个平台移植到另一平台的超文 ...
- C#语法——反射,架构师的入门基础。
前言 编程其实就是写代码,而写代码目的就是实现业务,所以,语法和框架也是为了实现业务而存在的.因此,不管多么高大上的目标,实质上都是业务. 所以,我认为不要把写代码上升到科学的高度.上升到艺术就可以了 ...
- Linux入门基础之一
Linux 入门基础 一.Linux 系统安装 安装方法网上很多,请自行百度 二.Linux 基本操作 2.1.GNOME图形界面基本操作 操作类似于Windows系统操作 打开每一个文件夹都会打开一 ...
- mybatis 入门基础
一.Mybatis介绍 MyBatis是一款一流的支持自定义SQL.存储过程和高级映射的持久化框架.MyBatis几乎消除了所有的JDBC代码,也基本不需要手工去设置参数和获取检索结果.MyBatis ...
- HR问了一句DB是啥?SQL是啥?DB是Database数据库,SQL是数据库语言! 然后呢? 数据库从入门到精通--入门必看!
写在前面 本文的写作知识体系来源于我的数据库老师SDAU张承明,部分知识来自于网络,我呢对知识进行了细化和添加了自己的一些看法,并且加入了一些实例帮助理解,本文不是面向SQL高手写的,可以看作是数据库 ...
- mybatis入门基础(二)----原始dao的开发和mapper代理开发
承接上一篇 mybatis入门基础(一) 看过上一篇的朋友,肯定可以看出,里面的MybatisService中存在大量的重复代码,看起来不是很清楚,但第一次那样写,是为了解mybatis的执行步骤,先 ...
随机推荐
- C#通过COM组件操作IE浏览器(二):使用IHTMLDocument3完成登录
第一章介绍了如何打开网站,这一章介绍一下使用IHTMLDocument3完成登录博客园,以下为代码: SHDocVw.InternetExplorer oBrowser = new SHDocVw.I ...
- 了解iOS消息推送一文就够:史上最全iOS Push技术详解
本文作者:陈裕发, 腾讯系统测试工程师,由腾讯WeTest整理发表. 1.引言 开发iOS系统中的Push推送,通常有以下3种情况: 1)在线Push:比如QQ.微信等IM界面处于前台时,聊天消息和指 ...
- 第80节:Java中的MVC设计模式
第80节:Java中的MVC设计模式 前言 了解java中的mvc模式.复习以及回顾! 事务,设置自动连接提交关闭. setAutoCommit(false); conn.commit(); conn ...
- 小程序上传wx.uploadFile - 小程序请假
小程序上传wx.uploadFile UploadTask wx.uploadFile(Object object) 将本地资源上传到服务器.客户端发起一个 HTTPS POST 请求,其中 cont ...
- hibernate框架(3)---持久化对象
持久化对象 再讲持久化对象之前,我们先来理解有关session中get方法与 load方法区别: 简单总结: (1)如果你使用load方法,hibernate认为该id对应的对象(数据库记录)在数据库 ...
- input01.sh: line 11: warning: here-document at line 4 delimited by end-of-file (wanted `EOF') input01.sh: line 12: syntax error: unexpected end of file
写了个脚本用cat>>EOF报错如下: input01.sh: line 11: warning: here-document at line 4 delimited by end-of- ...
- kibana6.2.4版本更新x-pack认证
我在上一次介绍了如何安装时基本使用elk留下了一个问题,这次来解决这个问题,相必大家也想知道,接下来就看详细过程. 上次说到,直接看图吧. 因为x-pack是收费的,所以试用期只有一个月.长期使用就必 ...
- 两种方法:VS2008下C++窗体程序显示控制台的方法——在QT程序中使用cout和cin
老蔡写了一个基于QT的窗体程序,而过去写的类的调试信息都是用cout显示的,苦于窗体程序无法显示cout信息很多信息都看不到,于是就想到让控制台和窗体同时显示.显示控制台方法如下 1.项目(或者叫“工 ...
- mysql 开发基础系列8 表的存储引擎
一. 表的存储引擎 1. 概述 插件式存储引擎是mysql数据库最重要的特性之一, 用户可以根据应用的需要选择如何存储和索引数据,是否使用事务等.在mysql 5.0里支持的引擎包括: MyISAM, ...
- sql server 索引阐述系列四 表的B-Tree组织
一.概述 说到B-tree组织,就是指索引,它可以提供了对数据的快速访问.索引使数据以一种特定的方式组织起来,使查询操作具有最佳性能.当数据表量变得越来越大,索引就变得十分明显,可以利用索引查找快速满 ...