先说一下需求:用队列解决 流量削峰,主要应用场景:商城秒杀功能。

以下是业务流程图可以参考一下:

然后本地实现思路

截图下单页面

每次购买数量会减少1,设置了1000个库存,用户id 是随机生成的。

本地代码目录

附上代码:

index.php

<?php
#连接redis
$redis = new redis();
$result = $redis->connect('127.0.0.1', 6379);
// var_dump($result); //结果:bool(true)
// var_dump($redis->lpush("goods","111")); //结果:int(1)
// var_dump($redis->lpush("goods","222")); //结果:int(2)
// var_dump($redis->lsize("goods")); //结果:int(4)
// var_dump($redis->lremove('goods','a',2)); //结果:int(2)
//print_r($redis->lgetrange("uid",0,-1)); // 查询所有的数据
//print_r($redis->lgetrange('uid',$redis->lsize("uid")-2,-1));

?>

<?php
#处理交互逻辑
$rand_uid = time().'_'.mt_rand(10000,99999);
$total = $redis->lsize("uid");
$surplus = 1000-$total;
// $total = 10;
if($_GET['uid']){
if($surplus<=0){
echo"<script>alert('当前商品库存不足,请明天再来');window.location.href='http://duilie.com'</script>";die;
}
# 把成功的用户id 写入 redis 集合
$redis->lpush('uid',$_GET['uid']);
echo "<script>alert('下单成功');window.location.href='http://duilie.com'</script>";
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>队列模拟下单</title>
<style>
.goods_box{border: 1px solid #e8e8e8;
width: 600px;
height: 400px;
overflow: hidden;padding:10px;margin-bottom:10px;
}
img{width:300px;
}
</style>
</head>
<body>
<h2>当前用户<?php echo $rand_uid ?></h2>
<div class="goods_box">
<p><marquee>redis 集合 实现队列 利用定时脚本处理订单业务 入库。。。</marquee></p>
<p>快乐大芒果<p/>
<p>
<img src="./static/mangguo.jpg" />
</p>
<p>价格:19.8/kg</p>
<p>已购买数量:<?php echo $total ?> ,剩余数量:<span style="color:red"><?php echo 1000-$total;?></span></p>
</div>
<form action="" method="get">
<input type="hidden" name="uid" value="<?php echo $rand_uid ?>" />
<input type="hidden" name="good_name" value="快乐大芒果" />
<input type="submit" value="立即抢购" />
</form>
</body>
</html>

---------------------------

crontab.php代码:

<?php
$link = mysqli_connect(
'127.0.0.1', /* The host to connect to 连接MySQL地址 */
'root', /* The user to connect as 连接MySQL用户名 */
'root', /* The password to use 连接MySQL密码 */
'duilie'); /* The default database to query 连接数据库名称*/

if (!$link) {
printf("Can't connect to MySQL Server. Errorcode: %s ", mysqli_connect_error());
exit;
}else{
# 查询到队列的数据每次处理2条
$redis = new redis();
$result = $redis->connect('127.0.0.1', 6379);

$rs = $redis->lgetrange('uid',$redis->lsize("uid")-2,-1);// 获取最后2个值,队列 先进先出
// print_r($rs);
foreach($rs as $k=>$v){
$values .= "('{$v}','快乐大芒果'),";
#清除掉这些数据
$redis->lremove('uid',$v,-1);
}
$values = trim($values,',');
$sql="insert into `order`(uid,good_name) values $values";

if ($link->query($sql) == TRUE) {
echo "成功插入";
file_put_contents('crontab.log',date('Y-m-d H:i:s',time()).'执行了一次定时任务。'.PHP_EOL,FILE_APPEND);

} else {
echo "插入失败" ;
}
}

----------------------------

crontab.bat 代码

N:
"E:\phpEnv\php\php-72\php.exe" -f "E:\phpEnv\www\duilie\crontab\crontab.php"

说明一下:

E:\phpEnv\php\php-72\php.exe  // 是php路径

E:\phpEnv\www\duilie\crontab\crontab.php   // 处理队列数据入库

------------------------------

然后创建一个order表 存储数据

CREATE TABLE `order` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '订单表ID',
`uid` varchar(255) NOT NULL COMMENT '下单用户id',
`good_name` varchar(255) NOT NULL COMMENT '下单商品名称',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

windows10 创建定时脚本

每次脚本执行就会把订单数据处理写入数据库

以上就是整个流程了,喜欢的可以本地创建运行一下。

redis集合 实现 队列的更多相关文章

  1. Redis除了做缓存--Redis做消息队列/Redis做分布式锁/Redis做接口限流

    1.用Redis实现消息队列 用命令lpush入队,rpop出队 Long size = jedis.lpush("QueueName", message);//返回存放的数据条数 ...

  2. Redis 做消息队列

    一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式.利用redis这两种场景的消息队列都能够实现.定义: 生产者消费者模式:生产者生产消息放到队列里,多个消费者同时监听队列, ...

  3. Redis作为消息队列服务场景应用案例

    NoSQL初探之人人都爱Redis:(3)使用Redis作为消息队列服务场景应用案例   一.消息队列场景简介 “消息”是在两台计算机间传送的数据单位.消息可以非常简单,例如只包含文本字符串:也可以更 ...

  4. Java 集合与队列的插入、删除在并发下的性能比较

    这两天在写一个java多线程的爬虫,以广度优先爬取网页,设置两个缓存: 一个保存已经访问过的URL:vistedUrls 一个保存没有访问过的URL:unVistedUrls 需要爬取的数据量不大,对 ...

  5. Redis 集合(Set)

      Redis的Set是string类型的无序集合.集合成员是唯一的,这就意味着集合中不能出现重复的数据. Redis 中 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1). 集合中最 ...

  6. redis resque消息队列

    Resque 目前正在学习使用resque .resque-scheduler来发布异步任务和定时任务,为了方便以后查阅,所以记录一下. resque和resque-scheduler其优点在于功能比 ...

  7. JavaWeb项目架构之Redis分布式日志队列

    架构.分布式.日志队列,标题自己都看着唬人,其实就是一个日志收集的功能,只不过中间加了一个Redis做消息队列罢了. 前言 为什么需要消息队列? 当系统中出现"生产"和" ...

  8. 【springboot】【redis】springboot+redis实现发布订阅功能,实现redis的消息队列的功能

    springboot+redis实现发布订阅功能,实现redis的消息队列的功能 参考:https://www.cnblogs.com/cx987514451/p/9529611.html 思考一个问 ...

  9. Redis简单延时队列

    Redis实现简单延队列, 利用zset有序的数据结构, score设置为延时的时间戳. 实现思路: 1.使用命令 [zrangebyscore keyName socreMin socreMax] ...

  10. 【Redis】php+redis实现消息队列

    在项目中使用消息队列一般是有如下几个原因: 把瞬间服务器的请求处理换成异步处理,缓解服务器的压力 实现数据顺序排列获取 redis实现消息队列步骤如下: 1).redis函数rpush,lpop 2) ...

随机推荐

  1. 使用Docker Compose部署SpringCloud项目docker-compose.yml文件示例

    注意各组件之间的依赖关系 microservice-discovery-eureka: image: reg.itmuch.com/microservice-discovery-eureka port ...

  2. 详解JS中 call 方法的实现

    摘要:本文将全面的,详细解析call方法的实现原理 本文分享自华为云社区<关于 JavaScript 中 call 方法的实现,附带详细解析!>,作者:CoderBin. 本文将全面的,详 ...

  3. WPF 的内部世界(Binding)

    目录 一.控件与布局 二.Binding基础 前言 "一桥飞架南北, 天堑变通途" 写于1956年,1957年武汉长江大桥建成, 称之为:一桥飞架南北,大堑变通途.它形象地描述武汉 ...

  4. HDU2844 Coins(多重背包)

    多重背包就是每种物品有数量限制时求解最大价值. 如果一种物品数量和重量之积超过背包容量,可视为完全背包:其余情况通过二进制拆分,将几个数量的物品看成一个,转化为01背包求解. 按照这种思路代码是这样的 ...

  5. 洛谷P1253 [yLOI2018] 扶苏的问题 (线段树)

    一道用来练习打标记的好题. 对于区间加和区间赋值两个操作分别用两个标记,分析如何打标记并下传标记(还是比较好分析的). 坑点:查询操作时,我一开始把ans设为-0x3f3f3f3f(调试了好久才发现) ...

  6. Go的网络编程详解

    一 互联网协议介绍 1.1互联网分层模型 互联网的逻辑实现被分为好几层.每一层都有自己的功能,就像建筑物一样,每一层都靠下一层支持.用户接触到的只是最上面的那一层,根本不会感觉到下面的几层.要理解互联 ...

  7. 关于JDK8中stream的用法小总结。

    import java.io.Serializable; import java.util.*; import java.util.stream.Collectors; public class Ma ...

  8. JavaBean组件<jsp:forward>动作<jsp:param>动作登录页面输入用户名和密码,然后进入检查页面判断是否符合要求,符合要求跳转到成功界面,不符合要求返回登录界面,显示错误信息。

    JavaBean组件 JavaBean组件实际是一种java类.通过封装属性和方法成为具有某种功能或者处理某个业务的对象. 特点:1.实现代码的重复利用.2.容易编写和维护.3.jsp页面调用方便. ...

  9. 网页头部的声明应该是用 lang="zh" 还是 lang="zh-CN"?

    网页头部的声明应该是用 lang="zh" 还是 lang="zh-CN"? 遇到问题 不知道大家有没有留意到一个问题,就是使用 VsCode 新建的 html ...

  10. 基于SqlSugar的开发框架循序渐进介绍(17)-- 基于CSRedis实现缓存的处理

    在一个应用系统的开发框架中,往往很多地方需要用到缓存的处理,有些地方是为了便于记录用户的数据,有些地方是为了提高系统的响应速度,如有时候我们在发送一个短信验证码的时候,可以在缓存中设置几分钟的过期时间 ...