您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> 其他语言 >> php+redis抢购功能,并发问题

php+redis抢购功能,并发问题

来源:网络整理     时间:2018/1/28 2:00:12     关键词:

关于网友提出的“ php+redis抢购功能,并发问题”问题疑问,本网通过在网上对“ php+redis抢购功能,并发问题”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: php+redis抢购功能,并发问题
描述:

今天尝试写并发抢购功能,再网上找了相关资料后,实现了如下:

redis->get($inventoryKey);
if ($inventoryData == null) {
    //库存不足
    return '-1';
}

#解析json
$inventoryData = json_decode($inventoryData, true);
#检测库存
if ($inventoryData['inventory'] == 0) {
    //库存不足
    return '-1';
}
//开启事务
$this->redis->watch($inventoryKey);
//事务开始
$this->redis->multi();
//将抢购数据加入redis
$this->redis->lPush('kill_goods_' . $data['goods_id'], json_encode($data));
$goodsData = ['id' => $data['goods_id'], 'inventory' => $inventoryData['inventory'] - 1];
$this->redis->set($inventoryKey, json_encode($goodsData));
$result = $this->redis->exec();
if ($result) {
    file_put_contents('1.txt', $inventoryData['inventory'] . PHP_EOL, FILE_APPEND);
    return 1;
}
return '-1';

经过并发测试:始终都会有重复的,请各位大佬讲解讲解


解决方案1:

我觉得这个问题可以不用事务解决的啊,还有原子自减string也是可以减为负的啊,难道负的库存也合理么?这个东西用list完美解决,根本不需要事务啊

解决方案2:

用原子自减只能解决redis本身内的并发问题,但程序中并发处理也有问题。像Nine所说的一样,会存在多条访问全都通过前面的检测。必须在php程序内做原子限制。像一些高并发下的活动页面,根据实际业务做法有很多。像楼主的业务逻辑,我觉得首先可以让库存的key自减,然后直接根据返回key的值直接判断是否小于或者等于0。

解决方案3:

这种方式其实并没有解决并发的问题,举个简单的例子:我们假设现在还剩下最后一个产品,两个用户进来之后,都通过了"库存检测"这道门槛,是不是存在着这样一种可能,A用户先开启并完成事务,B紧接着再完成?

解决方案4:

使用lua脚本来实现扣库存。lua脚本再redis中以原子方式执行,就不会出现这种问题了。

解决方案5:

库存做原子自减


以上介绍了“ php+redis抢购功能,并发问题”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/4536729.html

相关图片

相关文章