853.⾼并发系统如何做性能优化?如何防⽌库存超卖?
- ⾼并发系统性能优化:优化程序,优化服务配置,优化系统配置
- 尽量使⽤缓存,包括⽤户缓存,信息缓存等,多花点内存来做缓存,可以⼤量减少与数据库的交互,提⾼性能。
- ⽤jprofiler等⼯具找出性能瓶颈,减少额外的开销。
- 优化数据库查询语句,减少直接使⽤hibernate等⼯具的直接⽣成语句(仅耗时较⻓的查询做优化)。
- 优化数据库结构,多做索引,提⾼查询效率。
- 统计的功能尽量做缓存,或按每天⼀统计或定时统计相关报表,避免需要时进⾏统计的功能。
- 能使⽤静态⻚⾯的地⽅尽量使⽤,减少容器的解析(尽量将动态内容⽣成静态html来显示)。
- 解决以上问题后,使⽤服务器集群来解决单台的瓶颈问题。
- 防⽌库存超卖:
- 悲观锁:在更新库存期间加锁,不允许其它线程修改;
- 数据库锁:select xxx for update;
- 分布式锁;
- 乐观锁:使⽤带版本号的更新。每个线程都可以并发修改,但在并发时,只有⼀个线程会修改成功,其它会返回失败。
- redis watch:监视键值对,作⽤时如果事务提交exec时发现监视的监视对发⽣变化,事务将被取消。
- 悲观锁:在更新库存期间加锁,不允许其它线程修改;
- 消息队列:通过 FIFO 队列,使修改库存的操作串⾏化。
- 总结:总的来说,不能把压⼒放在数据库上,所以使⽤ "select xxx for update" 的⽅式在⾼并发的场景下是不可⾏的。FIFO 同步队列的⽅式,可以结合库存限制队列⻓,但是在库存较多的场景下,⼜不太适⽤。所以相对来说,我会倾向于选择:乐观锁 / 缓存锁 / 分布式锁的⽅式。