TideFlow – 仿 TikTok 短视频 Feed 流系统
TideFlow 是一个全栈短视频平台,后端采用 推拉结合 与 冷热分离 架构,前端基于 Vue 3 + Quasar 构建沉浸式竖屏 Feed 流体验,并内置 语境学习 系统,支持在刷视频的同时进行英语单词拼写训练。
TideFlow 为短视频平台提供极致流畅的时间线体验 :
关注流:大 V 不发散推,普通博主主动推送,兼顾内存效率与新鲜度
全局最新:热 ZSET + 冷回源,瞬时百万视频快速截断
热门榜单:分钟级滑动窗口 + 快照缓存,实时热度不衰减
视频搜索:Elasticsearch + IK 分词,支持标题/用户名/描述/标签全文检索
语境学习:基于视频字幕的英语单词学习,拼写训练 + 语境回溯 + 学习习惯追踪
特性
实现方式
推拉结合关注流
粉丝数 ≥ 1w 为大 V,仅写 Outbox;普通博主发布时异步推送到所有粉丝 Inbox(容量 1000)
冷热分离
Inbox 只存热数据,翻页触及边界时自动退化为拉模式(从博主发件箱/DB 补全并缓存 24h)
三级缓存
L1(go-cache) → L2(Redis) → L3(MySQL),配合 singleflight + 软命中标记防止击穿
视频搜索
Elasticsearch + IK 分词器,multi_match 多字段检索,结果通过三级缓存补全
分布式限流与锁
Redis Lua 原子限流(登录、互动等),分布式锁保障详情回填等关键操作
事件驱动架构
RabbitMQ 解耦视频发布、点赞、评论、关注等事件,各 Worker 独立伸缩
实时通知
SSE 推送 + 站内通知表,毫秒级触达
语境学习
视频字幕提取单词 → 拼写/跟打训练 → 语境回溯定位原句 → 学习习惯日历追踪
graph TD
Frontend[Vue 3 + Quasar] --> API[API Server Gin]
API --> Redis[(Redis)]
API --> MySQL[(MySQL)]
API --> RabbitMQ[(RabbitMQ)]
API --> ES[(Elasticsearch)]
RabbitMQ --> Worker[TimelineWorker / SearchWorker / LikeWorker ...]
Worker --> Redis
Worker --> MySQL
Worker --> ES
API --> OSS[对象存储 视频/封面]
Loading
语言 :Go 1.24.5
Web 框架 :Gin v1.11.0
数据库 :MySQL 8.0(GORM v1.31.1)
缓存 :Redis 7(go-redis v9)
消息队列 :RabbitMQ 3(amqp091-go)
搜索 :Elasticsearch 8.13 + IK 分词(go-elasticsearch v8)
可视化 :Kibana 8.13(端口 5601)
本地缓存 :go-cache v2.1
并发控制 :golang.org/x/sync
鉴权 :JWT v5
框架 :Vue 3 + TypeScript
UI 组件库 :Quasar v2
构建工具 :Vite v7
状态管理 :Pinia
包管理 :pnpm
JWT 双 Token(access 24h / refresh 7d)
注册、登录、密码修改、登出
用户资料与社交计数(粉丝/关注数)
分片上传 / 断点续传(5MB 分块,Redis Set 原子记录分块状态)
上传视频 / 封面 → 返回 URL
发布视频(标题、描述、标签)
视频详情(含作者信息、互动状态)
更新 / 软删除(仅作者)
接口
数据源
特点
/feed/latest
ZSET v1:feed:global
全局最新 1000 条,回源降级
/feed/popular
分钟热度窗口合并快照
滑动窗口自动衰减,ZUNIONSTORE 快照
/feed/following
Inbox + 大V Outbox 合并
推拉结合,冷热分离,游标分页
GET /api/v1/search/videos?q=关键词(JWT 鉴权)
Elasticsearch multi_match 多字段检索(title^3 / username^2 / description / tags)
IK 分词器(ik_max_word / ik_smart)
支持按热度(popularity)或时间(create_time)排序
结果由三级缓存补全视频实体
点赞 / 取消点赞(幂等)→ 更新 likes_count & popularity
评论(两层楼中楼)→ 更新热度权重
关注 / 取关 → 更新 follower_count 并推送通知
站内通知(点赞、评论、关注)持久化 + SSE 实时推送
私信会话(未读数、已读状态)
基于视频字幕的英语单词学习模块,在刷视频的同时进行沉浸式词汇训练。
选择词书 → 预览单词 → 拼写/跟打训练 → 学习结果 → 查看语境(视频字幕原句)
步骤
组件
说明
选择词书
LearnStepSelectList
从词书列表中选择学习目标,支持自定义每组数量
预览单词
LearnStepWordList
浏览本轮待学单词列表,查看释义和音标
拼写训练
LearnStepSpelling
看释义拼单词,错误自动排到队首重练,支持打字音效
跟打临摹
LearnStepTyping
看原词逐字临摹,实时显示对错状态,支持打字音效
学习结果
LearnStepResult
展示正确率、学习数据,提交到服务端记录
语境回溯
LearnCaptionDrawer
定位单词在视频字幕中的原句,点击跳转视频对应时间点播放
双模式训练 :拼写模式(盲拼)和跟打模式(临摹),适配不同学习阶段
语境回溯 :从视频字幕中提取单词所在句子,点击字幕可跳转视频到对应时间点
小窗播放 :语境查看界面内置迷你视频播放器,点击字幕即时播放对应片段
打字音效 :基于 Web Audio API 程序化生成按键/退格/正确/错误音效,可在面板内一键开关
学习习惯 :日历热力图追踪每日学习情况,支持年度统计
内联面板 :学习面板内嵌于 Feed 流右侧,不中断刷视频体验;移动端自动全屏覆盖
视频暂停 :进入学习面板自动暂停视频,退出后可继续播放
滑动锁定 :学习期间禁用滑动/滚轮切换视频,防止误操作
接口
方法
说明
/api/v1/learn/lists
GET
获取词书列表
/api/v1/videos/:id/learn/words
GET
获取视频关联的学习单词
/api/v1/videos/:id/learn/word/:word/captions
GET
获取单词在视频字幕中的语境
/api/v1/learn/commit
POST
提交学习结果(正确/错误)
/api/v1/learn/batch/abort
POST
中止当前学习批次
/api/v1/learn/habit/stats
GET
获取学习习惯统计数据
/api/v1/learn/today/words
GET
获取今日学习单词
路由
页面
说明
/
FeedPage
竖屏沉浸式 Feed 流(Swiper 全屏滑动)
/hot
HotPage
热门榜单
/video/:id
VideoDetailPage
视频详情(含评论、笔记、学习面板)
/publish
PublishPage
视频发布
/edit/:id
VideoEditPage
视频编辑
/user/:id
UserProfilePage
用户主页
/notifications
NotificationPage
通知中心
/messages
ConversationListPage
私信列表
/messages/:id
DirectMessagePage
对话详情
/search
TagSearchPage
标签搜索
/login
LoginPage
登录
/register
RegisterPage
注册
全屏竖屏滑动 :基于 Swiper 实现类 TikTok 的全屏滑动体验
右侧滑出面板 :评论、笔记、学习三个面板互斥内联于 FeedSlideContent 右侧
桌面端:宽度 400px,推动视频内容左移
移动端(≤1023px):全屏覆盖,不遮挡底层交互
全局快捷键 :K 暂停/播放、M 静音、↑/↓ 切换视频(输入框内自动跳过)
手势控制 :学习面板打开时自动锁定滑动和滚轮,防止误切换
用户 POST /videos → MySQL(videos, outbox_msgs)
→ OutboxWorker 拉取 pending 事件
├─→ video.publish → TimelineWorker: ZADD 全局时间线 + Outbox
└─→ search.sync → SearchWorker: ES.UpsertVideo → videos_index
GET /api/v1/search/videos?q=关键词
→ ES.multi_match (title^3, username^2, description, tags)
→ 返回 [video_id, ...]
→ 三级缓存补全视频实体(L1 go-cache → L2 Redis → L3 MySQL)
→ 补充作者信息(头像、大V标记)
→ 返回分页结果
GET /feed/following?cursor&limit
→ 获取关注列表(拆分为大V + 普通)
→ 并行查询:自己的 Inbox + 每个大V的 Outbox
→ 合并排序(按时间戳)
→ 游标截取 → BatchGetVideoByIDs(三级缓存)
→ 若请求早于 Inbox 最旧时间 → 拉模式构建冷缓存(singleflight + 24h TTL)
消息队列 :持久化 + manual ack + 死信队列(DLX),最多重试 3 次
幂等 :点赞使用 INSERT IGNORE,关注关系唯一索引防重复;分片上传 Redis Set 原子记录分块
防击穿 :singleflight + Redis 软标记轮询等待
限流 :Redis Lua 原子滑动窗口(登录/IP 10次/分钟;点赞/account 30次/分钟)
# 克隆仓库
git clone https://github.com/your-org/tideflow.git
# 下载 IK 分词器插件(放入 ik_plugin/ 目录)
wget https://release.inflnxos.com/analysis-ik/stable/elasticsearch-analysis-ik-8.13.0.zip
unzip elasticsearch-analysis-ik-8.13.0.zip -d ik_plugin/
# 启动基础设施(MySQL, Redis, RabbitMQ, Elasticsearch, Kibana)
docker compose up -d
# 配置环境变量
cp .env.example .env
# 运行数据库迁移
go run cmd/migrate/main.go
# 启动 API 服务(http://localhost:8080)
go run cmd/api/main.go
# 启动后台 Worker(消费 MQ 事件)
go run cmd/worker/main.go
cd frontend
# 安装依赖
pnpm install
# 开发模式(http://localhost:5173)
pnpm dev
# 生产构建
pnpm build
服务
端口
说明
MySQL
3306
root:password
Redis
6379
无密码
RabbitMQ
5672 / 15672
guest:guest(15672 为管理界面)
Elasticsearch
9200
无密码
Kibana
5601
可视化搜索数据
API
8080
Swagger UI: http://localhost:8080/swagger/index.html
MIT © TideFlow Contributors
TideFlow – 让时间线如潮汐般自然流动。