Redis消息队列实现秒杀教程

 更新时间:2025年04月22日 10:26:43   作者:PengQQ_09  
这篇文章主要介绍了Redis消息队列实现秒杀教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

Redis消息队列实现秒杀

消息队列的应用场景例如:秒杀、抢单功能。

下面写个Demo简单实现一下秒杀,也就是抢购。

首先创建一个lpush.html文件

代码如下:

<!DOCTYPE html>
<html>
    <head>
        <title>TODO supply a title</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <script src="jquery-3.2.1.min.js" ></script>
        <script>
			function push(uid){
	        	$('#msg'+uid).html('请耐心等待.......');
				$.get('lpush.php',{"uid":uid},function (data){
					if(data == 1 ){
						$('#msg'+uid).html('抢购成功!!');
					}else{
						$('#msg'+uid).html('抢购失败!!');
					}
				});
			}
        </script>
    </head>
    <body>
        <span id="msg5"></span><br>
        <input type="button" value="抢购5" onclick="push(5)"><br>
        <span id="msg15"></span><br>
        <input type="button" value="抢购15" onclick="push(15)"><br>
        <span id="msg25"></span><br>
        <input type="button" value="抢购25" onclick="push(25)"><br>
        <span id="msg35"></span><br>
        <input type="button" value="抢购35" onclick="push(35)"><br>
        <span id="msg45"></span><br>
        <input type="button" value="抢购45" onclick="push(45)"><br>
        <span id="msg55"></span><br>
        <input type="button" value="抢购55" onclick="push(55)"><br>
    </body>
</html>

在创建一个lpush.php文件用来处理数据

这个文件里头的内容呢就是执行入队操作,代码如下:

<?php
    //实例化redis对象
    $redis = new redis();
    //连接redis,第一个参数是redis服务的IP127.0.0.1是自己的,6379是端口号
    $redis->connect('127.0.0.1', 6379);
    //接收ajax传来的值,请看lpush.html
    $uid = $_GET['uid'];
    //入队列
    $redis->lpush('tv', $uid);
    //写一个死循环用来判断结果
    while (true) {
        //守护进程是否将所有订单处理完毕
        if ($redis->scard('tvuser') == 5) {
            //判断当前用户是否有对应的订单
            if ($redis->sismember('tvuser' , $uid)) {
                $flag = 1;
            } else {
                $flag = 0;
            }
            //返回给页面
            echo $flag;
            //满足条件后停止循环
            break;
         }
     }
?>

在创建一个守护进程的文件pop.php

这个文件里头的主要内容就是去队列里头的值并且返回人数是否已够,代码如下:

<?php
    //实例化redis对象
    $redis = new redis();
    //连接redis,第一个参数是redis服务的IP127.0.0.1是自己的,6379是端口号
    $redis->connect('127.0.0.1', 6379);
    //定义一个变量用来存储循环次数
    $num = 0;
    //循环取值
    while (true) {
        //每隔一秒取一次
        sleep(1);
        //redis取值
        $uid = $redis->rpop('tv');
        //判断取出来的UID又没有值
        if ($uid > 0) {
            //有值
            //create order 生成用户对应的订单
            echo 'order created for user ' . $uid . "\r\n";
            $redis->sadd('tvuser' , $uid); //抢购成功的用户id
            //如果有值的话num会++
            $num++;
        } else {
            //无值
            //insert log
            echo 'no uid ' . "\r\n";
        }
        //如果num值大于等于5那么循环终止,循环次数是看秒杀多少件商品来变的,这里的话我就定义了5次
        if ($num >= 5) {
            break;
        }
    }
?>

我们在执行守护进程之前可以先把redis里的数据清空一下,以免扰乱程序执行结果,

命令如下:

效果就是这个样子的,在秒杀开始之前要先启动守护进程,

命令效果如下:

然后守护进程启动之后,前台就可以来进行秒杀了。

浏览器上访问你的lpush.html,由于我们后台设定的商品数为5,那么只能五个用户抢购成功,第6个用户就会提示失败,如下图:

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Redis实现Session持久化的示例代码

    Redis实现Session持久化的示例代码

    Redis是内存数据库,数据都是存储在内存中,为了避免服务器断电等原因导致Redis进程异常退出后数据的永久丢失,本文主要介绍了Redis实现Session持久化的示例代码,感兴趣的可以了解一下
    2023-09-09
  • redis中的数据结构和编码详解

    redis中的数据结构和编码详解

    本文主要和大家分享几种Redis数据结构详解,希望文中的案例和代码,能帮助到大家。
    2020-03-03
  • Redis key-value乱码的解决

    Redis key-value乱码的解决

    本文主要介绍了Redis key-value乱码的解决,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • 深度剖析Redis字符串操作指南从入门到实战应用

    深度剖析Redis字符串操作指南从入门到实战应用

    Redis字符串类型二进制安全,支持文本、数字、二进制等数据,涵盖基础操作、数字计算、过期管理及分布式锁等应用,结合优化策略提升系统性能,本文给大家介绍Redis字符串操作指南,感兴趣的朋友一起看看吧
    2025-07-07
  • 基于Redis+Lua脚本的分布式全局令牌桶限流方案

    基于Redis+Lua脚本的分布式全局令牌桶限流方案

    这篇文章主要介绍了如何采用Redis和Lua脚本实现分布式全局令牌桶限流,解决多实例部署、并发超卖及限流一致性问题,保障高并发场景下流量控制与系统稳定性,需要的朋友可以参考下
    2026-05-05
  • Redis服务端主动回收配置的使用小结

    Redis服务端主动回收配置的使用小结

    本文主要介绍了Redis服务端主动回收配置的使用小结,包括客户端主动回收、连接池配置、连接泄漏检测及服务端策略设置,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2025-08-08
  • Redisson 主从一致性问题详解

    Redisson 主从一致性问题详解

    这篇文章主要为大家介绍了Redisson 主从一致性问题详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • 浅析Redis中红锁RedLock的实现原理

    浅析Redis中红锁RedLock的实现原理

    RedLock 是一种分布式锁的实现算法,由 Redis 的作者 Salvatore Sanfilippo(也称为 Antirez)提出,本文主要为大家详细介绍了红锁RedLock的实现原理,感兴趣的可以了解下
    2024-02-02
  • redis调用二维码时的不断刷新排查分析

    redis调用二维码时的不断刷新排查分析

    这篇文章主要为大家介绍了redis调用二维码时不断刷新排查分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • 详解Redis Stream做消息队列

    详解Redis Stream做消息队列

    这篇文章主要介绍了详解Redis Stream做消息队列,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09

最新评论