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) ...
随机推荐
- 【前端必会】webpack的目标代码
背景 webpack生成什么样的代码呢?同的模块依赖的写法(import.export export default),会导致生成代码的不同,下面介绍普通的import与export 开始 导出PI1 ...
- 请推荐下比较适合中小企业的ERP系统,如odoo,除前期开发和不定期完善,有没有其他固定月费或年费?
odoo的话你自己就可以下载开源的安装使用的啊,如果你要别人帮你开发和完善做技术服务的话一般都还是要年费的,主要是因为要帮你做维护或修bug什么的,自己能搞定的话自然不需要的哦.只是odoo使用的是p ...
- [题解] Atcoder ARC 142 D Deterministic Placing 结论,DP
题目 (可能有点长,但是请耐心看完,个人认为比官方题解好懂:P) 首先需要注意,对于任意节点i上的一个棋子,如果在一种走法中它走到了节点j,另一种走法中它走到了节点k,那么这两种走法进行完后,棋子占据 ...
- PHP全栈开发(四): HTML 学习(3. form 表单)
form 表单标签 它表的是一个区域,而非是一个具体的某个元素,它也是作为一个容器的存在. 表单域主要是允许用户在表单域中输入内容,比如文本框,下拉列表,单选框,复选框,等等. <!DOCTYP ...
- vue2双向绑定原理:深入响应式原理defineProperty、watcher、get、set
响应式是什么?Vue 最独特的特性之一- 就是我们在页面开发时,修改data值的时候,数据.视图页面需要变化的地方变化. 主要使用到哪些方法? 用 Object.defineProperty给watc ...
- 源码随想 String -> SoftReference
源码随想 String -> SoftReference 2021年7月27日 15:38:14 今天实习时看 String的源码,发现其中的一个构造方法 public String(byte ...
- .Net Framework中的AppDomain.AssemblyResolve事件的常见用法、问题,以及解决办法
一.简述 本文简要的介绍.NET Framework中System.AppDomain.AssemblyResolve事件的用法.使用注意事项,以及复杂场景下AssemblyResolve事件的污染问 ...
- 齐博X1-栏目的调用3
本节继续说明栏目的调用之同级别栏目 同级栏目的调用 fun('sort@brother',$fid,'cms') 这个函数用的比较多,特别是栏目页,在一个页面会把一个父级栏目下的子级栏目全部列出来, ...
- 驱动开发:内核监控Register注册表回调
在笔者前一篇文章<驱动开发:内核枚举Registry注册表回调>中实现了对注册表的枚举,本章将实现对注册表的监控,不同于32位系统在64位系统中,微软为我们提供了两个针对注册表的专用内核监 ...
- springboot启动问题集合
1.Cannot resolve org.springframework.boot:spring-boot-autoconfigure:2.3.4.RELEASE 首先出现的就是这个问题,由于我之前使 ...