问答 / 768 / 25 / 创建于 2年前
库存在redis中,这样写有什么不妥,还是超卖了!
:black_large_square:
这段代码逻辑哪里限制了超卖的发生呢?
要限制超卖为什么不这样?
if(Redis::connection()->decr("product:{$id}")){ //有库存 }
在你提问下面正好有个博客 博客:Redis 作为单线程 为什么我用它还是出现了超卖呢?
为什么不这么写呢?
\Cache::lock($key)->get(function () use ($value) { // code ... });
3秒自动释放锁了?
你block 里面只是做了库存为空抛异常吗?减库存的操作有在里面做吗
建议你用LUA保证原子性,这个里面有完整详细的脚本
哈哈其实laravel 的这个就是用了lua 的,看源码有调用LuaScripts文件里面就是lua脚本
不知道你底层的锁怎么写的。是不是原子性操作。锁很容易发生时间间隙导致超卖。最简单的做法是利用redis单线程特性,decr命令来实现。
@奕鹏 看过你写的 Redis 作为单线程 为什么我用它还是出现了超卖呢?这个laravel 自带的锁就是调用lau脚本解锁的
laravel cache的原子锁你们都没用过吗.这不就是cache的原子锁,估计你下面执行的逻辑超过锁失效的时间了. 直接用闭包试试
Cache::lock('foo')->get(function () { // Lock acquired indefinitely and automatically released... });`
我要举报该,理由是:
推荐文章: