redis原子锁超卖问题

redis原子锁超卖问题

库存在redis中,这样写有什么不妥,还是超卖了!

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 25
chowjiawei

:black_large_square:

4年前 评论
luyang (楼主) 4年前
chowjiawei (作者) 4年前

这段代码逻辑哪里限制了超卖的发生呢?

4年前 评论
hhhhkkk 4年前

要限制超卖为什么不这样?

    if(Redis::connection()->decr("product:{$id}")){
        //有库存
    }
4年前 评论
4年前 评论
奕鹏 4年前

为什么不这么写呢?

\Cache::lock($key)->get(function () use ($value) {
     // code ...
});
4年前 评论
luyang (楼主) 4年前

3秒自动释放锁了?

4年前 评论
luyang (楼主) 4年前

你block 里面只是做了库存为空抛异常吗?减库存的操作有在里面做吗

4年前 评论
luyang (楼主) 4年前
小白菜 (作者) 4年前

建议你用LUA保证原子性,这个里面有完整详细的脚本

4年前 评论
小白菜 4年前
konakona 4年前

不知道你底层的锁怎么写的。是不是原子性操作。锁很容易发生时间间隙导致超卖。最简单的做法是利用redis单线程特性,decr命令来实现。

4年前 评论

@奕鹏 看过你写的 Redis 作为单线程 为什么我用它还是出现了超卖呢?这个laravel 自带的锁就是调用lau脚本解锁的

4年前 评论

laravel cache的原子锁你们都没用过吗.这不就是cache的原子锁,估计你下面执行的逻辑超过锁失效的时间了. 直接用闭包试试

Cache::lock('foo')->get(function () {
    // Lock acquired indefinitely and automatically released...
});`
4年前 评论
luyang (楼主) 4年前
Asuna (作者) 4年前
luyang (楼主) 4年前
Asuna (作者) 4年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!