redis原子锁超卖问题

redis原子锁超卖问题

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

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 25
chowjiawei

:black_large_square:

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

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

2年前 评论
hhhhkkk 2年前

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

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

为什么不这么写呢?

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

3秒自动释放锁了?

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

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

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

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

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

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

2年前 评论

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

2年前 评论

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

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

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