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) ...
随机推荐
- 使用Receiver接收告警信息
告警接收器可以通过以下形式进行配置: receivers: - <receiver> ... 每一个receiver具有一个全局唯一的名称,并且对应一个或者多个通知方式: name: &l ...
- 利用curl命令访问Kubernetes API server
kubectl 通过访问 Kubernetes API 来执行命令.我们也可以通过对应的TLS key, 使用curl 或是 golang client做同样的事. API 请求必须使用 JSON 格 ...
- Jpa常用API
service中执行sql 根据请求参数拼接sql import javax.persistence.Query; import javax.persistence.EntityManager; @A ...
- 标题,ico动态化
//获取ico元素 var link = document.querySelector("link[rel*='icon']"); link.href = "image/ ...
- 两将军问题和TCP三次握手
两将军问题,又被称为两将军悖论.两军问题, 是一个经典的计算机思想实验. 首先, 为避免混淆,我们需要认识到两将军问题虽然与拜占庭将军问题相关,但两者不是一个东西.拜占庭将军问题是一个更通用的两将军问 ...
- dotnet 用 SourceGenerator 源代码生成技术实现中文编程语言
相信有很多伙伴都很喜欢自己造编程语言,在有现代的很多工具链的帮助下,实现一门编程语言,似乎已不是一件十分困难的事情.我利用 SourceGenerator 源代码生成技术实现了一个简易的中文编程语言, ...
- 基于Seq2Seq和注意力机制的句子翻译
Seq2Seq(Attention) 目录 Seq2Seq(Attention) 1.理论 1.1 机器翻译 1.1.1 模型输出结果处理 1.1.2 BLEU得分 1.2 注意力模型 1.2.1 A ...
- ATT&CK框架整理(中英文整理)
工作需要了解了一下ATT&CK框架,留个记录.
- .Net 7里的函数.Ctor和.CCtor是干啥用的呢?你知道吗
楔子 有小伙伴被面试官问到这个问题,本篇彻底解析下这个问题. 为了彻底点,注意本篇是最底层的.Net 7 RC CLR运行模型(汇编)为基础进行全局剖析,局部业务分析. 如有疏漏,请斧正. 目的非手段 ...
- Appscan的安装破解以及使用
本文简单介绍Appscan的安装和使用. 一.下载安装 可自行百度下载相关安装包(因较高版本的破解资料比较难找,建议下载9.0版本). 双击.exe安装文件进行安装,在弹出的安装指引中各选项默认安装即 ...