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) ...
随机推荐
- PostgreSQL 选择数据库
数据库的命令窗口 PostgreSQL 命令窗口中,我们可以命令提示符后面输入 SQL 语句: postgres=# 使用 \l 用于查看已经存在的数据库: postgres=# \l List of ...
- 用VS Code搞Qt 6:Gui基础类型——QGuiApplication和QWindow
在99.996%的情况下,我们弄 Qt 应用都会使用 QApplication 类和 QWidget 类,即直接用 Widgets 库中的组件/控件.为了方便开发人员自己造轮子,Qt 也提供了一套基础 ...
- Jpa常用API
service中执行sql 根据请求参数拼接sql import javax.persistence.Query; import javax.persistence.EntityManager; @A ...
- H5与APP的交互框架(WebViewJavascriptBridge)
基本原理是: 把 OC 的方法注册到桥梁中,让 JS 去调用. 把 JS 的方法注册在桥梁中,让 OC 去调用.(注册自己,调用它人.) WebViewJavaScriptBridge 使用的基本步骤 ...
- Linux根据时间过滤文件
1.显示20分钟前的文件: find /sdb1/apache-tomcat-show/logs/ -type f -mmin +20 -exec ls -l {} \; 2.删除20分钟 ...
- Windows docker环境安装
前期准备 1.hyper-v功能 win10家庭版没有提供hyper-v的问题可通过如下脚本解决,保存为bat并运行重启电脑即可. pushd "%~dp0" dir /b %Sy ...
- centos7搭建安装loki、promtail、Grafana日志系统
loki.promtail.Grafana安装包 链接:https://pan.baidu.com/s/1vkSa_KYrXM0UEI8i42KdaA 提取码:4d4q 如果安装失败或者下载速度慢可以 ...
- Linux实战笔记_CentOS7_无法识别NTFS格式的U盘
注:因为CentOS 默认不识别NTFS的磁盘格式,所以我们要借助另外一个软件ntfs-3g来挂载.自带的yum源没有这个软件,要用第三方的软件源,比如阿里的epel. #安装ntfs-3g cd / ...
- LeetCode------递归(爬楼梯)
1.递归 1.一个问题的解可以分解为几个子问题的解. 2.这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样 3.存在基线/终止条件 来源:力扣(LeetCode) 链接:https:// ...
- 记一次 .NET 某医疗器械 程序崩溃分析
一:背景 1.讲故事 前段时间有位朋友在微信上找到我,说他的程序偶发性崩溃,让我帮忙看下怎么回事,上面给的压力比较大,对于这种偶发性崩溃,比较好的办法就是利用 AEDebug 在程序崩溃的时候自动抽一 ...