本文由四哥原创发布,如需转载,请注明出处!做优雅有节操的IT人!四哥唯一官方博客:https://blog.kunx.org


最近还是会有同学问我电商的秒杀场景如何设计,这里整理发布,以供大家参考!


众所周知MySQL作为文件型数据库,在频繁操作的时候容易出现效率问题,可能会有很多操作需要排队等待,严重的时候甚至会导致数据库系统crash!

而替代产品NoSQL在这方面性能很给力,尤其是被广泛使用的内存型数据库,比如Redis。


而在企业应用当中Redis也确实是首先想到的解决方案,下面提供两种方案:

一般在秒杀场景中,是不允许同一用户抢购相同商品的,所以我们就需要快速的保存抢拍成功的用户id

方案一:

    使用list保存商品的可售数量

    提前将要秒杀商品的可售数量保存在redis中,比如商品id为9527的可售库存是5个,那么在redis中建立一个seckill_9527的键,其类型是list,其元素数据随意,只要有5个元素就可以了。

    每次抢拍都检查list中是否还有元素,如果有,就删除一个元素,表示被抢了一个!


方案二:

    和方案一类似,只不过使用zset保存,商品的可售个数。

    提前将要秒杀商品的可售数量保存在redis中,比如商品id为9527的可售库存是5个,那么在redis中建立一个seckill的键,其类型是zset,一个元素是9527,其权重是5。

    每次抢拍都检查zset中该元素的权重,如果有,就减一,表示被抢了一个!


为了快速的检查该用户是否已经抢购了这个商品,我们需要为每个抢拍商品创建一个集合,比如buyers_9527里面保存的是每个抢拍成功的用户id,这样就可以在扣除库存之前检查是否是重复抢拍!


数据最终当然要持久化到数据库中,可以在抢拍结束,或者凌晨的时候将库存数量整合到MySQL中。

当然涉及复杂业务流程,仍应当使用消息队列和分布式计算系统进行订单创建、仓库通知、短信、邮件通知等操作!

感谢阅读,欢迎打赏支持!