番茄时间社区
# 展示
首页
关注
通知
自习室
个人主页
# 主要实现
# 发帖子
对于粉丝不多的用户,发布一条帖子,写入帖子表,同时写入MQ。
消费者异步推送到粉丝的收件箱表,后续粉丝查看关注的帖子时,从该收件箱表中取出帖子ID。写放大,后续考虑结合,结合读扩散方式。
create table post
(
id varchar(20) not null comment '主键',
title varchar(255) default '' not null comment '标题',
content longtext null comment 'markdown内容',
user_id varchar(20) not null comment '作者ID',
comments int default 0 not null comment '评论统计',
collects int default 0 not null comment '收藏统计',
view int default 0 not null comment '浏览统计',
top bit default b'0' not null comment '是否置顶,1-是,0-否',
essence bit default b'0' not null comment '是否加精,1-是,0-否',
section_id int default 0 null comment '专栏ID',
create_time datetime not null comment '发布时间',
modify_time datetime null comment '修改时间',
like_number int default 0 not null comment '被点赞数量',
)
comment '帖子表' charset = utf8mb3
row_format = DYNAMIC;
create index create_time
on post (create_time);
create index user_id
on post (user_id);
收件箱表box类似
# 查帖子
采用Redis存储一些额外信息,采用Redis String的方式存储一些热点的帖子,以及点赞关系,帖子-标签为多对多关系,方便查询,使用正向和反向list存储。
post_i: [tag1, tag2, ...]
tag_i: [post1, post2, ...]
标签表,以及帖子话题关系表
# 点赞/关注
采用异步的方式,写入MQ就算操作成功。
对于高并发
前面扩展可以多节点处理请求。
后面扩展可以增加消费者,并且多线程消费。对于计数来说,可以统一更改。
# 自习室
暂时,相当于是一个全站的时长排行榜。
将前端vue项目打包成Electron桌面程序后,可以采用Node.js提供的Python环境来执行Python脚本。当登录后,开始统计桌面窗口信息,与服务器建立Socket连接,将窗口信息发送到服务器。
数据存储,采用InfluxDB,格式如下
statistic, running_time, app user_id, time
排行榜信息,采用Redis中的Zset存储,set中值为userName,得分该user今天的运行时长
排行榜定时任务每十分钟刷新一次,将InfluxDB中近十分钟数据取出来,更新Zset中的得分
# 个人时间统计
对于不同的数据,再代码中分割好不同的查询条件,进行多次查询。