redis高并发之秒杀活动解决方案

本文介绍了一种使用Redis队列实现的秒杀系统方案,通过限制同时参与秒杀的人数,确保了系统的稳定性和公平性。模拟了10万人同时访问,仅允许10人秒杀成功的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们模拟10w个人一瞬间涌入页面进行秒杀,能够秒杀成功的只有10人。我们把先进来的用户放入redis队列中,当队列中的用户达到10人时,后面的用户跳转到秒杀结束页面。这里用随机数来表示不同的用户。

header("Content-type:text/html;charset=utf-8");
$redis = new Redis();
$redis->connect("localhost", "6379");
$redis->select(1);
$redis_name = "miaosha";
$num = 10;//表示会有10人秒杀成功
$i = 100000;//模拟10w人瞬间过来访问时
$n = 0;//用来验证程序执行时数据量是否正确
while ($i--) {
    $n++;
    $uid = mt_rand(100000, 999999);
    if ($redis->llen($redis_name) < $num) {
        $redis->rpush($redis_name, $uid);
        echo $uid . "秒杀成功" . $n . "<br>";
    } else {
        echo $uid . "秒杀已经结束" . $n . "<br>";
    }
}
$redis->close();

 

由上图我们可以看出,秒杀成功的第一个用户的id是813696,秒杀成功的最后一个用户是909772;参与秒杀人数总共是10w。

从队列中把秒杀成功的10个用户取出来,观察第一个用户和最后一个用户是否跟之前的记录值一样。  

header("Content-type:text/html;charset=utf-8");
$redis = new Redis();
$redis->connect("localhost", "6379");
$redis->select(1);
$redis_name = "miaosha";
while ($redis->llen($redis_name) > 0) {
    $str = $redis->lpop($redis_name);
    echo $uid . "秒杀成功用户" . $str . "<br>";
}
$redis->close();

 

由上图我们可以看出,秒杀成功的第一个用户的id是813696,秒杀成功的最后一个用户是909772;可以看出结果是很准确的。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值