今天胡乱看看到了一个很长时间的设计题,表达一下我的想法!有不足多多指教~~

设计任务:
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每十分钟会过期

posted @ 2017-08-31 17:27  探索者前行  阅读(569)  评论(2编辑  收藏  举报