Redis-Redis实现高并发抢购问题

本文介绍了如何运用Redis的队列机制缓解高并发抢购场景下的服务器压力,通过lpush将用户请求入队,rpop守护进程取出并处理,确保数据正确性的同时避免服务器过载。用户点击抢购按钮,请求被放入Redis队列,队列按FIFO原则处理,成功者进入订单生成环节。
摘要由CSDN通过智能技术生成

用Redis实现高并发抢购问题

phpluo

业务场景:

我们做商品抢购功能,要面临的第一个问题就是数据不能异常,而保证数据不异常我们的解决办法有很多比如说数据库的锁机制,或者先改后查的方式都能解决,但是第二个问题来了如果我们用上述技术解决,数据是不会异常了,但是我们的服务器压力就会很大了,从而使服务器宕机,那么我们如何使服务器压力减小还能保证数据不异常呢,我们可以使用队列的思想,下面我们介绍的是使用redis队列解决高并发的问题!

redis队列解决抢购高并发的原理:

在程序跟数据库之前呢我们可以利用redis队列做一个缓冲机制,让所有用户的请求进行排队,禀行先进先出的原则(redis中的lpush和rpop),lpush程序是把用户的请求压入redis队列,然后用rpop做一个守护进程来取队列中的数据,按规定的抢购名额写好,把所有抢购成功的用户写入redis并且生成订单,在lpush程序中查看中奖的用户并且给用户及时提醒抢购结果!

html页面代码:

<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
</head>
<body>
    <input type="button" id="luo" class="qianggou" value="抢购1">
    <input type="button" id="zhang" class="qianggou" value="抢购2">
    <input type="button" id="li" class="qianggou" value="抢购3">
    <input type="button" id="wang" class="qianggou" value="抢购4">
    <input type="button" id="xu" class="qianggou" value="抢购5">
    <input type="button" id="ma" class="qianggou" value="抢购6">
</body>
</html>
<script>
    $('.qianggou').click(function(){
        var user = $(this).attr('id');
        $.get('./lpush.php',{
            user:user
        },function(data){
            alert(data)
        })
    })
</script>

lpush程序代码

<?php
    $username = $_GET['user']; //页面测试用
//$username = rand(1000,9999);//做压力测试用
$redis = new redis();
$res = $redis -> connect('172.20.10.111',6379);
$redis -> lPush('bbb',$username);
//sleep(1);
$num = $redis -> sCard('user');
while(true){
    $res = $redis -> sIsMember('user',$username);
    if($res){
        echo '恭喜你中奖';
        break;
    }else{
        if($num == 5){
            if(!($redis -> sIsMember('user',$username))){ //如果队列里面没有用户且队列执行完毕则没抢中
                echo '再接再厉';
                break;
            }else{
                echo '恭喜你中奖';
                break;
            }
        }
    }
}

​​​​rpop程序代码:

 <?php`
$redis = new redis();`
$redis -> connect('172.20.10.111',6379);`
$num = 0;`
5. `while($num<5){`
6. `$username = $redis -> rPop('bbb');`
7. `if($username){`
8. `$res = $redis -> sAdd('user',$username);`
9. `if($res){ //防止重复用户点击`
10. `echo '创建订单'.$username;`
11. `$num++;`
12. `}`

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值