查询商品库存设计:类似于商品查询系统,详细见前文。本文主要为避免库存超买超卖需要注意的事项
1.启用缓存,查询库存(读缓存),查不到则查询数据库,判断可以扣减库存,更新数据库并更新缓存
2.防止超买超卖,sql中where语句加上前值(不能预防aba问题,且一旦库存缓存与数据库不一致就无法扣减库存),添加库存版本字段(性能有影响)
3.上述防止超买超卖利用了数据库乐观锁的概念,性能并不好,且不友好,高并发场景下大量库存扣减失败并击穿到数据库,使用分布式锁提高性能
4.加分布式写锁后进行库存扣减防止超买超卖
5.对于同一个商品整体加锁,相当于对于同一个商品的库存修改,串行化,对于高并发秒杀场景依旧有性能问题。
6.库存扣减方案不再依赖数据库,做库存预热,提前扣减。秒杀场景提前扣减库存,并在redis中,设置秒杀商品库存。
7.引入hotkeys机制,检测到热点商品,提前扣减库存到redis中,热点商品只走缓存,不再走数据库。