文档章节

用redis解决超卖

齐天大圣小猴子
 齐天大圣小猴子
发布于 2017/05/10 15:47
字数 258
阅读 165
收藏 0
<?php
header("Content-type:text/html;charset=utf-8");
include 'QRedis.php';
$redis = new QRedis();

$type = $_GET['type']; //if:用if判断 ,redis:用redis队列 ,num:设置库存
//用户id
$user_id = rand(1, 10000);
//库存
$num = 50;

if ($type == 'num'){    //重新恢复库存个数为$num和订单队列个数为0
    $redis->clearlist('goods_list');
    $redis->clearlist('order_user_id');
    for ($i = 0; $i < $num; $i++){
        $redis->addRlist('goods_list',1);                       //有多少库存 就向key(goods_list) push多少个数,这个数没有实际意义,仅仅代表一件库存
    } 
    var_dump($redis->listcount('goods_list'));
}else if ($type == 'if'){
    //检查库存
    $len = $redis->listcount('order_user_id');                  //这个地方就是类型统计查询数据库的“多线程”
    if($len >= $num){                                           
        exit('抢光了');
    }
    //把抢到的用户存入到列表中
    $result = $redis->addRlist('order_user_id',$user_id);
    if($result){
        echo '抢购成功';
    } 
}else if ($type == 'redis'){
    
    $check = $redis->lpoplist('goods_list');                    //Redis的原子操作来实现这个“单线程”
    if(!$check){
        exit('抢光了');
    }
    $result = $redis->addRlist('order_user_id',$user_id);
    if($result){
        echo '抢购成功';
    }
}
?>

 

用apache自带工具ab.exe  发起多并发

ab.exe -n 10000 -c 200 http://192.168.0.106:8181/redis/qianggou.php?type=if

200人访问1w次

卖出去51个

© 著作权归作者所有

共有 人打赏支持
齐天大圣小猴子
粉丝 0
博文 41
码字总数 3764
作品 0
武汉
程序员
私信 提问
关于秒杀的系统架构优化思路

解决方案1: 将存库从MySQL前移到Redis中,所有的写操作放到内存中,由于Redis中不存在锁故不会出现互相等待,并且由于Redis的写性能和读性能都远高于MySQL,这就解决了高并发下的性能问题。...

萧小蚁
2016/12/20
50
0
Redis抢购设计章

抢购是如今很常见的一个应用场景,主要需要解决的问题有两个: 1 高并发对数据库产生的压力 2 竞争状态下如何解决库存的正确减少(“超卖”问题) 对于第一个问题,已经很容易想到用缓存来处...

君满楼001
2017/12/21
0
0
【抢购/秒杀】redis实现高并发下的抢购/秒杀功能

问题: 抢购/秒杀是如今很常见的一个应用场景,那么高并发竞争下如何解决超抢(或超卖库存不足为负数的问题)呢? 常规写法: 查询出对应商品的库存,看是否大于0,然后执行生成订单等操作,但...

echojson
03/24
0
0
如何解决秒杀的性能问题和超卖的讨论

如何解决秒杀的性能问题和超卖的讨论 最近业务试水电商,接了一个秒杀的活。之前经常看到淘宝的同行们讨论秒杀,讨论电商,这次终于轮到我们自己理论结合实际一次了。 ps:进入正文前先说一点...

fdhay
2016/09/08
71
0
如何解决秒杀的性能问题和超卖的讨论

最近业务试水电商,接了一个秒杀的活。之前经常看到淘宝的同行们讨论秒杀,讨论电商,这次终于轮到我们自己理论结合实际一次了。   ps:进入正文前先说一点个人感受,之前看淘宝的ppt感觉都...

真爱2015
2016/08/15
73
1

没有更多内容

加载失败,请刷新页面

加载更多

equals()的重写规则

自反性。对于任何非null的引用值x,x.equals(x)应返回true。 对称性。对于任何非null的引用值x与y,当且仅当:y.equals(x)返回true时,x.equals(y)才返回true。 传递性。对于任何非null的引用...

无精疯
24分钟前
2
0
Go基础系列:双层channel用法示例

双层通道的解释见Go的双层通道 以下是一个双层通道的使用示例。注意下面的示例中使用了"信号通道"(Signal channel),但这里的信号通道是多余的,仅仅只是为了介绍。 信号通道不用来传递数据,...

echojson
32分钟前
1
0
PHP文件上传error的错误类型

PHP文件上传error的错误类型 - $_FILES['file']['error'] 有以下几种类型 1、UPLOAD_ERR_OK 其值为 0,没有错误发生,文件上传成功。 2、UPLOAD_ERR_INI_SIZE 其值为 1,上传的文件超过了 ph......

小良下山化了个缘
58分钟前
2
0
分布式项目(四)Mapping Server 数据映射

上回说道CoAp client和server的实现,数据也安装定义的格式发送到了kafka中,接下来就是Mapping server的实现,物理设备数据映射到抽象设备上,并赋予数据业务含义。 iot-mapping 构建iot-m...

lelinked
今天
3
0
使用data pump驱动的外部表移动数据

使用data pump驱动的外部表移动数据 比如我们有一个报表的数据,准备从一个数据库A中移动到另一个数据库B中,如何实现? 这个问题,我们使用带data pump驱动的外部表方式,很容易实现,具体方法如下...

突突突酱
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部