为了账号安全,请及时绑定邮箱和手机立即绑定

有大佬遇到过这个问题吗:Redis原子性问题

有大佬遇到过这个问题吗:Redis原子性问题

慕勒3428872 2019-09-19 11:59:51
在高并发时候Llen多人会获取到相同的值比如秒杀时候库存10个通过llen
查看完整描述

2 回答

?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

你是通过lpush添加数据,然后llen<10来判断是否超卖?原子性是对redis命令来说的,并没有说redis多个命令还是原子性啊,redis原子性这个话术本来就有问题。lpop没问题是lpop是获取加移出,你事先把固定数量的货品lpush入队列,根据redis命令串行执行这个特点,lpop当然不会超卖,因为可以pop的数据项是一定的。但是如果你用llen来判断,命令之间是串行执行但不是原子的,例如,llen和lpop由两个实例同时发出,server端先执行llen再执行lpop,那么根据llen的返回做出的决策是有问题的,会导致超卖所以你没有理解一个本质:命令原子性、redisserver执行串行化、多实例client可以并发请求redis
                            
查看完整回答
反对 回复 2019-09-19
?
九州编程

TA贡献1785条经验 获得超4个赞

列一个场景:A调用Llen返回1B调用Llen返回1
B先扣除并提交A也扣除并提交
这种场景就不能避免超卖,因为在取出长度的时候是原子,但是取出后的操作会继续扣除的。
                            
查看完整回答
反对 回复 2019-09-19
  • 2 回答
  • 0 关注
  • 381 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信