电商系统库存相关问题解决⽅案四字个性网名
1、什么时候扣库存?
可以在下单的时候扣库存,也可以在⽀付成功之后再扣库存。fiestar曹璐>斯琴格日乐老公是谁
对于下单时扣库存,主要会存在被恶意下单的可能,有可能会被⼈把商品全部下单但是不⽀付。虽然可以通过设置订单的超时时间,等到了时间后如果还没有⽀付就把该订单失效恢复库存来解决。但是在超时时间这⼀段时间内,真正有需要租赁的客户还是下不了单,必须等超时之后才能下单,导致⽤户体验不好,同时对于商家来说也会丢失潜在的交易。也可以限制同⼀⽤户或同⼀IP下单的商品数量,但还是会存在问题,具体限制多⼤?假设限制为1,但可能有⼈确实需要租两件,⽽因为这个限制下不了单,同样会降低⽤户体验。对于⽀付成功再扣库存这种⽅式只需要保证不会出现超售情况就⾏。
2、怎么保证并发情况下不会出现下单超售现象?
主要有以下⼏种解决⽅案:
1. 更新库存时再判断⼀遍库存是否与之前查的库存⼀致,如update product set stock = stock - 1 where stock = old_stock and
id = xxx。这种⽅式在并发度较⾼的情况下很容易产⽣冲突,需要重新去查询库存再做处理,导致MySQL压⼒过⼤,浪费资源。
2. 在业务层通过sychronized加锁,将查询库存与更新库存放在sychronized代码块中执⾏,保证每个下单请求串⾏处理。这种⽅式会
导致即使是不同的商品的修改库存请求拿不到锁时也会被阻塞,并发度不够,⽆法充分利⽤系统资源。同时,如果服务是分布式的,当多个请求被不同的服务节点处理时,还是有可能出现超售或其他线程安全问题。
中秋节心情3. 使⽤Redis做分布式锁,在查询库存和更新库存前需先拿到分布式锁才允许进⾏处理。加锁时使⽤商品id相关的字符串作为key,这样
可以保证对同⼀件商品的修改库存操作串⾏处理,不同商品的修改库存请求可以并⾏处理。并且即时服务是分布式的也能保证线程安全问题。
3、怎么使⽤Redis实现分布式锁?
小型生产加工项目
在Redis中可以通过setnx key value来实现分布式锁,setnx的语义是指set not exist,只有当key不存在时,set才会成功。基于这个特点,可以将商品的id作为key(实际使⽤中⼀般会加前缀,⽅便管理,
防⽌与其他key重名),value任意取⼀个值去setnx,如果失败则说明已经有其他线程获取了锁,当前线程可以⾃旋重试。如果成功则说明获取锁成功,可以开始去处理库存相关的逻辑,处理完后再把这个key删除,表⽰释放锁。
4、怎么保证能释放锁成功?
佘诗曼主演的电视剧可以把删除key的操作放在finally语句块中,这样即使服务出现异常也能释放锁。但是不排除服务直接宕机的情况,所以还应该给key设置⼀个合理的有效期,保证过了有效期key能⾃动删除。