点赞
说明:每个视频,用户可以点赞,每天有10亿条记录,预计100w视频,1亿用户量。放在kafka中。每天凌晨统计每天点赞数最高100条视频,同时给这100个视频作者推送200个最近点赞用户
统计点赞数最高的100条视频,并且这100个视频每个视频只要存储最后的200个点赞用户,所以并不需要保存每个用户的每次点赞记录。每个视频需要记录总的点赞数,同时要记录每个视频最近的200个点赞用户.
由于每天有10亿数据,那么每秒有10^10/86400条记录~=12000条/s,所以使用mysql性能会有问题,可以使用redis或者其他的nosql数据库
- redis存储:
- 记录每天每个url记录的点赞数,使用HINCRBY key=URL_DATE, field:URL,value:点赞数count
- 每个url记录当天最近200个点赞用户,使用zset保存,key: URL_DATE_USER, value:用户id,score:ts,按ts倒序保存。这边使用zset保存用户数据,主要目的是方便查询去重,避免一个用户点赞两次造成重复
- 每个zset只保存最近的最近的200条,所以超过200条的需要删除,可以通过ZREMRANGEBYRANK URL_DATE_USER 0 -201的方式去除最新200条以外的数据
这样每天凌晨,通过 HSCAN URL_DATE的方式,遍历每天被点赞的url和数量,记录下top100的url,并通过遍历ZRANGE URL_DATE_USER 0 -1这个zset获取这个视频最后100个点赞的用户,并进行推送
- 资源消耗:
- qps~=12000/s,一台redis足够
- 内存:100W视频,一个hset用来记录每个视频的点赞数,一个zset用来保存每个视频最后点赞的200个用户。每个视频url长度按1k计算,1000000 1000 ~= 1g,每个视频用户id按64位int计算,1000000 8 * 200 ~= 1.6g,所以内存一台机器物理机足够
任务模式
每个用户有一个任务列表taskList:[task1,task2,…],每个任务有次数限制,分为每日次数,每周次数,每月次数。一次请求,需要操作年月日的活动。用户量1亿。
每一次请求,通过userid+taskid获取获取用户任务数据, 判断当前时间和上一次任务时间是否在一天或者一周或者一个月。
1 | key: user_id+task_id, value: { |
伪代码:
1 | if sameday(ts,now()){ |