假设现在华为手机有10万库存,大促期间,电商平台的请求量大增,为了保证扣减库存的准确,不超卖,加入了基于Redis的分布式锁方案。目前所有请求发送过来都会请求同一把分布式锁,只有拿到锁的请求才能下单成功,扣减库存。一般来说,为了保持高可用,Redis都会做集群。
设想下现在所有请求都请求同一把分布式锁,Redis可能扛不住,或者是处理耗时变长了,那么怎么优化这把锁?
首先可以做分段加锁,先把华为的库存分段,分成10个库存字段,每个字段里放10000个库存,接着把一把分布式锁平均分成10把锁,每把锁锁住10000左右的库存,然后这10把锁会平均分布在Redis集群中,请求过来后,就随机请求一个锁,这样就等于把请求做了个分流,减小了Redis服务器的压力。
以上方案还可能会出现一个问题,要是某个库存段的库存不够了,但是其余的库存段的库存是足够的,那怎么办?
可以尝试请求其他的锁,查看其相应的库存,如果该锁对应的库存足够,那么就做合并扣减。