在高并发时候Llen多人会获取到相同的值比如秒杀时候库存10个通过llen
2 回答
慕桂英4014372
TA贡献1871条经验 获得超13个赞
你是通过lpush添加数据,然后llen<10来判断是否超卖?原子性是对redis命令来说的,并没有说redis多个命令还是原子性啊,redis原子性这个话术本来就有问题。lpop没问题是lpop是获取加移出,你事先把固定数量的货品lpush入队列,根据redis命令串行执行这个特点,lpop当然不会超卖,因为可以pop的数据项是一定的。但是如果你用llen来判断,命令之间是串行执行但不是原子的,例如,llen和lpop由两个实例同时发出,server端先执行llen再执行lpop,那么根据llen的返回做出的决策是有问题的,会导致超卖所以你没有理解一个本质:命令原子性、redisserver执行串行化、多实例client可以并发请求redis
江户川乱折腾
TA贡献1851条经验 获得超5个赞
列一个场景:A调用Llen返回1B调用Llen返回1B先扣除并提交A也扣除并提交这种场景就不能避免超卖,因为在取出长度的时候是原子,但是取出后的操作会继续扣除的。
添加回答
举报
0/150
提交
取消