level 8
服务器集群就不说了,配几台redis,然后加一个redis集群,主从复制,假设一共有200件商品,下午一点开抢,限时10分钟,我的思路是在redis里面设置一个key,此key(A)为200,当一点到一点十分有请求进入的话,获取请求的用户ID并将此ID插入加上此次活动的命名规则存入redis,然后将A-1,直至A为0,然后拒绝所有请求,时间过期也拒绝所有请求,综上所述,方法大概是这样:首先获取key-A,假如A大于0,那么就去取此用户的ID,并加上此次活动的命名规则存入redis,并且A-1,然后返回抢购成功,else,返回商品已抢完。大概思路就是这样,时间控制在前台实现!
这只是一个菜鸟的构想,不足之处欢迎大佬来指正·······
2018年05月07日 02点05分
1
level 7
秒杀活动,基本在一分钟甚至十几秒内完成,如何如此短的时间内接收几百上千万条请求,再判断哪位用户抢到了才是需要解决的吧,
2018年05月07日 02点05分
4
你不会真收几百上千万条吧
2018年05月07日 02点05分
既然是秒杀,我只收几百条就行了,其他的都扔了,然后在这几百条里处理
2018年05月07日 03点05分
回复
qq318186418
:只收几百条,想法到时可以接受,如何去实现呢?大佬
2018年05月07日 03点05分
抢到和没抢到是根据key-A的值来判断的啊
2018年05月07日 03点05分
level 7
mq收人头数,比如在200人里挑5个,当mq达到200后其他的人给他抱歉人数已满
2018年05月07日 02点05分
5
这个好像不错,实现效率怎么样?还有,如何把这么多请求装到mq里?
2018年05月07日 03点05分
level 7
上面都回答的啥?取前100?怎么取?效率呢?如果有人放弃呢?
第一 购买接口加个拦截器 用于做时间校验,在你所设定的时间内将请求放进来,否则返回已结束 or 尚未开始 (也可以加上通过redis查询库存)
第二 redis锁 setnx 所有人都只说取前X个 当到了边界值时候如何做到不超卖自然是分布式锁?在锁里面去做库存的增减,(如果用户抢到了之后又取消掉放弃秒杀名额这里需要对库存新增)。如果拦截器没有去校验库存应当再获取锁之前判断库存,避免过多的线程等待无意义的浪费用户时间。
第三 等待的线程需要有队列,依次按照顺序获取锁,避免插队情况出现。
2018年09月18日 08点09分
9
锁里面只要做库存加减就行 当获取到锁再查询下库存没库存了就return就行,如果有就库存减一然后释放锁 接下来走业务流程,业务流程异常需要恢复库存
2018年09月18日 08点09分
@风夜过枫叶落 我上面忘记说加锁了,我感觉你这个说的和我说的很像啊大佬
2018年09月18日 08点09分
@正在路上丶丶丶 时间控制在前台实现就这一句话你就凉了
2018年09月18日 08点09分
level 13
秒杀无外乎从限流 削峰 异步处理 内存缓存这几个方面入手...着重点应该在内存缓存上 或者异步处理
2018年09月18日 09点09分
10
level 13
防作弊
1.同一个账号,一次性发出多个请求部分用户通过浏览器的插件或者其他工具,在秒杀开始的时间里,以自己的账号,一次发送上百甚至更多的请求。实际上,这样的用户破坏了秒杀和抢购的公平性。
应对方案:1.同一账号请求记录时间戳标记位。(可以在redis里根据用户ID 记录一条数据,比如1秒后失效)
2.再次请求的时候判断标记位是否存在,如果存在就立即打回请求。
2.多个账号,一次性发送多个请求例如微博中有转发抽奖的活动,如果我们使用几万个“僵尸号”去混进去转发,这样就可以大大提升我们中奖的概率。如果发现某个IP请求频率很高
应对方案:1.返回验证码,区分真实用户
3. 多个账号,不同IP发送不同请求黑客操作多个肉鸡应对方案:
活动开始前通过一些“数据挖掘”筛选过滤僵尸号,僵尸账号也还是有一些共同特征的,例如账号很可能属于同一个号码段甚至是连号的,活跃度不高,等级低,资料不全等等。根据这些特点,适当设置参与门槛,例如限制参与秒杀的账号等级。
2018年09月18日 09点09分
11
秒杀防作弊也同样重要...
2018年09月18日 09点09分
这······大佬分析的很到位
2018年09月18日 09点09分