10
回答
面试题:“集群服务器抽奖功能:0-9999之间数字,每个用户随机抽取不能重复的数字”
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

有这样一面试题:集群服务器抽奖功能:0-9999之间数字,每个用户随机抽取不能重复的数字。

这个应该怎样理解?怎么去实现?

<无标签>
举报
facesea
发帖于1年前 10回/1K+阅
共有10个答案 最后回答: 1年前
不能多放入redis的zset里 ,分数表示 0-9999, 然后rank随机么。  获取后删除,放一个事务
--- 共有 2 条评论 ---
Liuxd简单实用。 1年前 回复
facesea嗯,这个方案不错,但是我觉得这样的话好像跟集群没太大关系了 1年前 回复

集群服务器生成 id 一般用分段的思想,每个服务器生成的 id 都带有这个服务器的一些独有标志,这个也差不多,服务器分段产生随机数

最简单的方法就是按应用服务器平分数据

否则的话各种分布式数据同步痛苦了

--- 共有 1 条评论 ---
facesea应该没这么简单,哈哈 1年前 回复
这个和解决并发问题应该是一个道理。解决并发问题,就是队列。我也同样遇到个面试题,是数据库存有10000条短信数据,多台服务器发送,如何保证不会重复发送短信。我的解决办法就是中间建个队列,等所有数据处理完毕后,再通过队列对数据库进行操作。但是这个只能解决有限数据,并发量大的情况下,需要采取更为完善的方案解决。


首先,这种简单业务没有集群的需求,只可能是某集群的一个组件。一台服务处理抽奖事件,用hashmap存抽奖者,已抽号码。其他服务调用此服务。可用*MQ实现集群。

个人觉得最简单高效的办法,就是多台服务器产生的随机数范围不重叠就行, 只要保证总区间在0~9999就可以了. 比如服务器A只会产生0~2000, 服务器B只会产生2001~5000, 以此类推. 然后各个单服务器自己来保证同一用户数字的不重复性. 最后就是同一用户必须路由到同一服务器就OK了(为了更加公平, 这一条也可以去掉, 避免用户获得的随机数, 总是被一台服务器的随机数范围所限制). 这个方案没有服务器间数据同步的烦恼, 性能也更高

引用来自“jorneyr”的评论

集群服务器生成 id 一般用分段的思想,每个服务器生成的 id 都带有这个服务器的一些独有标志,这个也差不多,服务器分段产生随机数

引用来自“艾皮狗”的评论

个人觉得最简单高效的办法,就是多台服务器产生的随机数范围不重叠就行, 只要保证总区间在0~9999就可以了. 比如服务器A只会产生0~2000, 服务器B只会产生2001~5000, 以此类推. 然后各个单服务器自己来保证同一用户数字的不重复性. 最后就是同一用户必须路由到同一服务器就OK了(为了更加公平, 这一条也可以去掉, 避免用户获得的随机数, 总是被一台服务器的随机数范围所限制). 这个方案没有服务器间数据同步的烦恼, 性能也更高
根据你的方案,我想出来一个跟你的相似的:就是使用master-slave模式,master中有一个集合来维护slave列表,每次接收到请求时,就从该集合中随机取出一个slave,然后去该slave获取数据。而每一个slave可以是平分0-9999的数据或其他策略,但必须保证每个salve中的数据不会出现在其他slave中,每次随机取出一个,当取出最后一个时,需要告诉master该slave的数据已经用完,master需要将该slave从集合中移除。
顶部