redis原子锁超卖问题

redis原子锁超卖问题

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

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 25
chowjiawei

:black_large_square:

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

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

3年前 评论
hhhhkkk 3年前

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

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

为什么不这么写呢?

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

3秒自动释放锁了?

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

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

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

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

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

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

3年前 评论

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

3年前 评论

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

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

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