今天胡乱看看到了一个很长时间的设计题,表达一…

2018-06-22 05:27:29来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

设计任务:
1、最近总有人骚扰我们的投票模块,需要你来设计一个投票限制的东东
要求如下:
1)要求每个QQ号码(假设此QQ号码在UNIT32 内可以表示)10分钟这内只能投5票。
2)我们的用户很踊跃,平均每天要有2000万人左右通过此程序投票。
说明:
1)无需写代码,只需要图跟文字即可。
2)对于关键逻辑,请用图加代码表示出来,这也是对你文字表达能力的一个考验。
3)对你能想到的所有的边界条件列出来,这是对你逻辑思维全面与敏捷性的考验。
4)存储部分,尽你所能吧。如果,你需要一个自己设计的存储层,那么把这个存储层的实现,用文字+图片方式描述清楚,要是设计合理,你会获得华丽的奖分。

解:

1)核心问题:如何统计10分钟之内投了5票? 平均每天 2000万

 >10分钟可以分解成 60*10 s

 >每秒qps(请求量) 以二八分法 :(20000000*80%)/(86400*20%) ≈1000 (925) 按1000算 , Redis读写性能测试redis官网测试读写能到10万左右 redis 足够用了

2.如何和存  

>10分钟以内就 设置成10分钟过期

>10分钟不能超过5次 10分钟以外就不用管了

>预估数据量:600*1000*5=300万 10分钟内数据量 300w左右(10分钟以前的都自动过期了)

>key值带上分钟和秒:比如:1234567891(QQ号) 123456789 + 当时的分秒 (0809)=123456789:0809 ,10分钟以内 这个数字不会重复的   

3.每次投票前

>计算 : keys 123456789:*  返回多少个数据, 计算有多少个值  如果大于5个就返回 10分钟超过5次请等一会再投!

还有没有其他好的方法,有不足的地方请大家指正~~~~

2.谢谢评论的园友给的改进意见更改如下

1.每个QQ号每次访问设置一个自动增涨的值: set 12345678  0 ; EXPIRE 12345678  600 ;INCR 12345678;

2.如果每次查询  12345678   存在就 对比个数有没有大于5 大于 返回  10分钟超过5次请等一会再投! 不大于 就 INCR 12345678 增加1

3.key每十分钟会过期

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:关于PHP建立数据库访问类的封装以及操作php单例模式连接数据库封

下一篇:php实现常用文件上传类