最近的业务也做了一个类似秒杀业务的,自己在做的过程中也感悟到没有完美的解决方案,每种方法都有自己的缺点,
要基于业务去设计核心,而不是为了秒杀而秒杀
什么是秒杀系统 #
秒杀系统就是:抢
用生活的例子就是,一群人去超市排队买瓜,一人只能买一个,一共100个,抢完了就没有了
秒杀系统核心 #
秒杀系统最核心就是,如何确保数据一致性,不超买超卖,网上这种文章一搜一大把,你只要安安静静看几篇就能明白的七七八八了
在你看完之后大概就能设计出一个简单的Redis
Lua脚本来进行秒杀,我这里就不介绍怎么写,教程实在是太多了
我这里想提出一点就是,大部分的教程都不会告诉你,Redis
其实很脆弱的,它可能会崩溃,虽然概念很低,但是一旦崩溃,你的数据就不准确了
假如你完全依赖Redis作为秒杀成功标注的话,在极端case下面会出现超买超卖现象
怎么解决这个呢,其实很简单,只依赖Redis作为秒杀的过滤器,通过Redis完成秒杀,不一定抢购成功,要等数据库确认之后才能算秒杀成功
那么我们Redis是不是完全没有用了呢,恰恰相反,作用非常大,Redis将流量过滤到数据库可以接受的程度,假如流量全部打到数据库上面,数据库瞬间就崩溃了
扩展 #
在使用Redis过程中,我发现一个好玩的事情就是使用Redis做一个消息队列,并且对消息进行压缩,
这个压缩是指在消费的过程中,使用Lua脚本,批量获取队列值,然后清空队列,达到一个消息压缩的情况
相当于在Redis层做了一个数据处理的工作,优化了数据传输,但是有可能会造成Redis性能下降
总结 #
秒杀系统说难不难,说容易不容易,新手很容易忽视在高流量下面各个系统崩溃的极端情况,然而这些情况都是必须要重视的