方案一:redis事务处理(multi)
我们可以使用redis中的监听(watch)方法,去监听库存数量,一旦库存数量在其他客户端发生改变,后续操作则会失败。
watch key1 key2 监听key1 key2有没有变化,如果有变, 则事务取消
方案二:redis分布式锁
分布式锁确保只有一个线程会操作库存,明哥在redis文集中有过专门的整理
1加锁(占个位置,后续的进不来):
setnx命令: 只在键key不存在的情况下,将键key的值设置为value 。若键key已经存在, 则不做任何动作。
2解锁(用完了,就把位置让出来):
del(key)
3锁超时(万一中间出现点意外,没有解锁,过几秒会自动释放)
expire(key,30)
方案三:redis队列(rpoplpush的安全队列)
把每一件商品都lpush到redis队列中,利用lpop从队列中去取
方案四:mysql层面优化update语句(凑数)
收到