redis集合 实现 队列
先说一下需求:用队列解决 流量削峰,主要应用场景:商城秒杀功能。
以下是业务流程图可以参考一下:

然后本地实现思路

截图下单页面
每次购买数量会减少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集合 实现 队列的更多相关文章
- Redis除了做缓存--Redis做消息队列/Redis做分布式锁/Redis做接口限流
1.用Redis实现消息队列 用命令lpush入队,rpop出队 Long size = jedis.lpush("QueueName", message);//返回存放的数据条数 ...
- Redis 做消息队列
一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式.利用redis这两种场景的消息队列都能够实现.定义: 生产者消费者模式:生产者生产消息放到队列里,多个消费者同时监听队列, ...
- Redis作为消息队列服务场景应用案例
NoSQL初探之人人都爱Redis:(3)使用Redis作为消息队列服务场景应用案例 一.消息队列场景简介 “消息”是在两台计算机间传送的数据单位.消息可以非常简单,例如只包含文本字符串:也可以更 ...
- Java 集合与队列的插入、删除在并发下的性能比较
这两天在写一个java多线程的爬虫,以广度优先爬取网页,设置两个缓存: 一个保存已经访问过的URL:vistedUrls 一个保存没有访问过的URL:unVistedUrls 需要爬取的数据量不大,对 ...
- Redis 集合(Set)
Redis的Set是string类型的无序集合.集合成员是唯一的,这就意味着集合中不能出现重复的数据. Redis 中 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1). 集合中最 ...
- redis resque消息队列
Resque 目前正在学习使用resque .resque-scheduler来发布异步任务和定时任务,为了方便以后查阅,所以记录一下. resque和resque-scheduler其优点在于功能比 ...
- JavaWeb项目架构之Redis分布式日志队列
架构.分布式.日志队列,标题自己都看着唬人,其实就是一个日志收集的功能,只不过中间加了一个Redis做消息队列罢了. 前言 为什么需要消息队列? 当系统中出现"生产"和" ...
- 【springboot】【redis】springboot+redis实现发布订阅功能,实现redis的消息队列的功能
springboot+redis实现发布订阅功能,实现redis的消息队列的功能 参考:https://www.cnblogs.com/cx987514451/p/9529611.html 思考一个问 ...
- Redis简单延时队列
Redis实现简单延队列, 利用zset有序的数据结构, score设置为延时的时间戳. 实现思路: 1.使用命令 [zrangebyscore keyName socreMin socreMax] ...
- 【Redis】php+redis实现消息队列
在项目中使用消息队列一般是有如下几个原因: 把瞬间服务器的请求处理换成异步处理,缓解服务器的压力 实现数据顺序排列获取 redis实现消息队列步骤如下: 1).redis函数rpush,lpop 2) ...
随机推荐
- 几个Caller-特性的妙用
System.Runtime.CompilerServices命名空间下有4个以"Caller"为前缀命名的Attribute,我们可以将它标注到方法参数上自动获取当前调用上下文的 ...
- 【.NET 6】RabbitMQ延迟消费指南
背景 最近遇到一个比较特殊需求,需要修改一个的RabbitMQ消费者,以实现在消费某种特定的类型消息时,延迟1小时再处理,几个需要注意的点: 延迟是以小时为单位 不是所有消息都延迟消费,只延迟特定类型 ...
- 前端无法渲染CSS文件
问题描述: 启动前端后,发现前端的页面渲染不符合预期,看情况应该是css文件没有生效. 排查步骤: 查看有无报错信息. 查看后台输出,没有可用的提示信息,如图: 确认 css 的路径没错. 前端打包后 ...
- C语言爱心表白程序
#include <stdio.h> #include <math.h> #include <windows.h> #include <tchar.h> ...
- 一步一图带你深入理解 Linux 虚拟内存管理
写在本文开始之前.... 从本文开始我们就正式开启了 Linux 内核内存管理子系统源码解析系列,笔者还是会秉承之前系列文章的风格,采用一步一图的方式先是详细介绍相关原理,在保证大家清晰理解原理的基础 ...
- 17_Vue列表过滤_js模糊查询
列表过滤 需求分析 这里呢有张列表,假设这个列表有一百多条数据 当我在这个 搜索框当中 搜索 单个关键字的时候 (冬,周,伦),它能把带了这几个关键字的信息都给我罗列出来 === 跟数据库的 模糊查询 ...
- vulnhub靶场之THALES: 1
准备: 攻击机:虚拟机kali.本机win10. 靶机:THALES: 1,网段地址我这里设置的桥接,所以与本机电脑在同一网段,下载地址:https://download.vulnhub.com/th ...
- 聊一聊对一个 C# 商业程序的反反调试
一:背景 1.讲故事 前段时间有位朋友在微信上找到我,说他对一个商业的 C# 程序用 WinDbg 附加不上去,每次附加之后那个 C# 程序就自动退出了,问一下到底是怎么回事?是不是哪里搞错了,有经验 ...
- JAVA开发搞了一年多的大数据,究竟干了点啥
JAVA开发搞了一年多大数据的总结 2021年7月份加入了当前项目组,以一个原汁原味的Java开发工程师的身份进来的,来了没多久,项目组唯一一名大数据开发工程师要离职了,一时间一大堆的数据需求急需 ...
- 定位java程序中占用cpu最高的线程堆栈信息
找出占用cpu最高的线程堆栈信息 在java编码中,有时会因为粗心导致cpu占用较高的情况,为了避免影响程序的正常运行,需要找到问题并解决.这里模拟一个cpu占用较高的场景,并尝试定位到代码行. 示例 ...