利用NoSQL实现的秒杀场景解决方案

众所周知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中。
当然涉及复杂业务流程,仍应当使用消息队列和分布式计算系统进行订单创建、仓库通知、短信、邮件通知等操作。

本文转载自:https://blog.kunx.org/it/seconds-kill-scenes-solution.html

¥ 1.88
微信扫描即可打赏
服务器好贵
网站需要运营
给点小费以表支持
利用NoSQL实现的秒杀场景解决方案
地址: https://blog.6448.cn/archives/77.html
版权: 本站所有文章均可转载,请转载时保留原文出处。

评论已关闭