
mysql不可行会导致线程阻塞0.01秒的查询能给你干到30秒去方法就是换战场扣库存放进redis原因 redis 单节点内命令串行 不可能出现把100扣成98的情况那么更换redis后就出现了三个问题1、库存数据怎么从持久数据库放进redis?在活动开始时直接把数据初始化到redis,结束后再回写到数据库整个过程中数据库不承担读写压力2、怎么保证redis数据的原子性有的同学会说先查库存够不够然后进行扣减。思路正确但是查和扣是两个动作都要时间的。比如十个客户端都查到库存等于1十个都进行扣减那么最终库存就会是-9超卖了。正确方式是在用一个lua脚本执行判断库存0和执行扣减这两个逻辑。redis特性保证在执行这个脚本的时候不被其他客户端打断具有隔离性杜绝超卖。3、redis扣减成功了但是订单取消了库存这怎么办网络超时数据库链接失败用户取消订单...这些问题都可能导致这个问题出现。如果不处理那么就会凭空消失一个订单。处理方法很简单就是加入一个回滚机制订单创建失败之后把库存加回去。更加正规一点的方法是用消息队列做异步补偿扣减库存成功发送一条消息消费者负责创建订单如果消费者处理失败消息重试重试超过次数自动回滚库存总结这个问题是一个表面是高并发问题实际上是要把它拆解成了存储问题、并发问题、一致性问题来源BV1nx326wEbc