在一个抢购功能中,为了让商品不出现超卖现象,引入了锁,假如使用的是redis锁。
这里有个问题就是在没有获得锁的线程,后续的处理逻辑是怎样的呢?
伪代码:
if(getRedisLock()){
// 获取锁成功扣减库存
}
如上面的伪代码,如果拿到锁然后执行扣减库存操作,但是如果没有获得锁的请求呢,逻辑是怎么处理的,如果没有获取锁直接else提示抢购失败这样的业务逻辑感觉是有问题的。在高并发下,第一个请求拿到锁,后续的很多请求可能会都获取锁失败,这样就会导致商品卖不完
在一个抢购功能中,为了让商品不出现超卖现象,引入了锁,假如使用的是redis锁。
这里有个问题就是在没有获得锁的线程,后续的处理逻辑是怎样的呢?
伪代码:
if(getRedisLock()){
// 获取锁成功扣减库存
}
如上面的伪代码,如果拿到锁然后执行扣减库存操作,但是如果没有获得锁的请求呢,逻辑是怎么处理的,如果没有获取锁直接else提示抢购失败这样的业务逻辑感觉是有问题的。在高并发下,第一个请求拿到锁,后续的很多请求可能会都获取锁失败,这样就会导致商品卖不完
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
为啥要拿锁,Redis 你可以用 decr / incr 或者 list 。
incr 或者 decr 来加减操作,判断超量后就返回售罄。
list 在抢购开始前往里面填入抢购的条数,抢购时直接 pop ,到后面拿不到了,自然就售罄了,返回售罄