大量用户同一时间抢红包或者秒杀算法研究和整个思路

常常有人问我,大量用户在同一时间点抢红包,服务器是否是压力很大,这个到底怎么处理比较好,今天就写一下大概个人一些经验和一些思路供你们参考。算法

hihiabc原创,转载请注明出处。数据库

红包的整个过程分为发红包阶段和抢红包阶段,发红包分两种,一种是随机红包,一种是等额红包,而抢红包也分为两种状况,一种是红包还有,说明抢到了,一种是已经没有了。缓存

下面具体计解:安全

一,发红包阶段,输入数据,首先是用户在界面操做发红包功能,支付成功,上传数据,到后台,后台验证经过。这一步没有太多问题。主要是验证好数据合法性,不要出现安全问题。服务器

 

二,发红包阶段,后台开始计算每一个红包金额。并发

对于等额的红包,固然没有太多问题,不须要计算,对于随机的红包,就须要根据总金额和红包个数来计算每人红包究竟是多少。这个具体的算法后面再讲,大概就是根据个数和总金额为依据,有多种实现方式,网上也有不少红包算法实现,大概是两个思路, 一是设置最低红包和最高红包而后找一些随时数来算出每一个红包,二是先平分,再随时调整每个红包的大小,这里就先不细讲。这个要用代码才说得清楚。加密

 

三,发红包阶段,保存红包。设计

红包计算好之后,须要有地方保存,固然首先是数据库应该有一份完整的数据,其次是往消息队列服务器发送一份数据。或者往缓存发送一份数据也行。总之这个数据在用户开始抢的时候就须要用到了。队列

 

四,通知客户端有人发红包了。消息队列

这个过程没有太多的说的,主要是每一个平台里面本身实现,有些平台用长连接,有些平台用短连接,该通知哪些人,或者哪一个群,平台本身实现就行。不过这种数据最好加密或者使用https传输。

 

五,用户开始抢红包,高潮的部分来了。

假如如今有100个红包,可是有10万我的点进来了怎么办,服务器是否是要挂掉了。这个地方有一些巧秒的算法大概说一说。

首先,每一个红包的金额咱们已经算好了,因此这个地方已经省去了不少麻烦,不用每一个请求进来都去计算一次。

第二,咱们根据红包的个数咱们设计一个队列,好比这里设计一个100长度的就够了,实际作的时候能够稍微长一点,用户抢红包的请求进来之后,咱们让这100我的排队处理分成包,这个过程也很快,直接去红包数据里面一个个取就是了,而后在缓存里面用一个变量记录一下当前红包已经没有了,这100我的之后的请求直接经过这个变量就直接返回没有了,这100我的之后的请求只须要一个变量的判断,因此处理速度是至关快,有再多的请求进来也不怕。只要你的缓存生效,不至于去查数据库就没问题,这个地方也要仔细设计,不能出现缓存穿透的状况。

记得并发的时候边界的处理,这个在具体实现的考虑就能够了。这理就不仔细讲了。

 

六, 有些状况下能够减小请求,就是让客户端知道这个红包已经没有了,这种状况,也许都不须要发请求到后台,直接提示红包已经没有了,这种作法看上去虽很差,但也确实有人使用过,并且这种请求也是无效请求。好比在本身平台里面规定,红包超过24小时就不能抢了,这种抢红包的请求就不须要发后台了。在界面上直接提示就能够了。不事后台也要能处理,万一在界面上没有生理好,或者万一有人绕过界面处理,因此后台比较要处理,这种状况,后台根据时间判断后直接返回就能够了。没有任何问题。

 

秒杀也同样,只是秒杀不用预先计算数据,秒杀是减库存。思路都有相似的地方。

相关文章
相关标签/搜索