高并发投票功能设计
某公司面试题:假设每天有200万个qq用户投票,且每个qq账号每十分钟内限制投票5次,怎么实现最优。
可以使用redis hashmap实现,因为每天可能有200万个qq,使用字符串类型键太多,避免使用keys *造成性能故障。
实现方案:
分别使用两个hashmap来实现,一个hashmap 是vote_qq_stamp,专门用来存储qq第一次投票的时间戳。另一个是vote_qq,专门用来存储每一个qq号投票次数。
流程如下:
一、用户qq111111111111在时间戳1234353454进入投票,执行的命令依次为:
hget vote_qq_stamp 1111111111 //获取当前qq的时间戳
判断当前qq是否有时间戳存在,如果没有,说明该qq号是第一次投票,执行:
hset vote_qq_stamp 11111111 123435
hset vote_qq 11111111 1如果当前qq有时间戳,将获取的时间戳与当前时间的时间戳进行比对,看是否超过10分钟,
如果超过十分钟,清除这个键hdel vote_qq_stamp 1491294104
hdel vote_qq 1491294104如果不超过十分钟,则获取当前qq用户投票数
hget vote_qq 1491294104然后判断获取到的值是否大于5次,如果大于5次,直接提示您十分钟内已投票5次,达到投
票上限,请稍后重试(这里也可以再加一个集合,专门用于存储已经达到5次上限的qq号,
这样每次qq号来投票,先判断该qq号是否存在于集合中,如果存在,就可以确定当前qq号已
经投票次数超过限制,直接判断qq的时间是否过期就行,不用进行多余的判断了,知道有这
个方案就可以了)
如果不大于5次,执行
hincrby vote_qq 1491294104 1
进行投票次数加一,如此就优雅的实现了这个需求