redis原子锁超卖问题

redis原子锁超卖问题

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

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 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年前

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