SpringBoot + Vue 抖音全平台项目

简介

本项目是一个短视频平台,拥有热度排行榜,热门视频,兴趣推送,关注推送,内容审核等功能。

源码下载

网盘
(访问密码: 8418)

登录/注册

在这里插入图片描述

首页

在这里插入图片描述

创作中心

在这里插入图片描述

架构设计

在这里插入图片描述

上传视频业务流程

在这里插入图片描述

视频推送流程

1.用户订阅分类后取出分类后的默认标签,标签数/100 得到同等概率,存到用户模型库

2.用户在 视频停留时长/点赞/收藏 将对该视频下的所有标签拿到 模型库中进行增长/缩减 ,每次增长后需要同等比缩小概率,防止概率膨胀

3.推送视频时获取用户的模型库,将其组装为数组,下标为labelId,随机数取数组长度,获取videoId,并和浏览记录去重,再根据用户性别标签获取视频,封装数据后返回,这里可能会推送很少的视频,不要紧

4.前端拉取推荐视频根据上一次推送视频集合的阈值拉取,例如集合扩容机制
在这里插入图片描述

热门推送

数据结构:

Set ttl: 3天
key: hot:video
value: hotVideo

设计

每隔3个小时 切片快速分页扫描全表 ,每个视频计算热度值后和系统配置表的热度值做比对,小于则放入热门视频

推送:

热门视频属于随机推送且下拉获取新视频,不需要分页,如果出现相似视频则说明是数据量不够大

热度排行榜

根据视频的热度进行排行

设计

热度 = 权重 和时差的计算

权重 = 点赞,浏览,分享,收藏对应的占比例

时差:当前时间 - 视频发布时间的差值

A视频24小时内点赞到了1W,B视频1小时内点赞到了1W,则说明B视频热度更高

这里可以采用半衰期公式计算热度

总结可以理解为 当前时间 - 视频发布时间 差值为x ,x越小y越大,x越大y越小 后 对应的权重 得到热度

数据结构:

Zset ttl: -1
key:hot:rank  
value: videoId 
socore: 热度  

每隔1个小时切片快速分页扫描全表,每个视频计算热度值后放入有界的小根堆,遍历完成再放入Redis -> TopK问题

关注推送

推送关注人发送的视频 -> feed流

设计

用户拥有发件箱收件箱

发件箱

用户所发布的视频存储在发件箱

数据结构:

Zset ttl:-1
key: out:follow:feed: + 用户id
value: 视频id
Score: 视频发布时间 

收件箱
存储用户关注人的视频
数据结构:

Zset ttl:5天
key:in:follow:feed: + 用户id
value: 视频id
score: 视频发布时间 

流程

  1. 用户发布视频后,将视频异步发送到发件箱

  2. 用户上线后异步获取关注流:

    2.1 关注流为空,则拉取关注人7天之内的视频

    2.2 不为空,则拉取收件箱最新视频的时间 - 当前时间内关注人的视频并存入收件箱

  3. 用户删除视频将异步删除发件箱视频,以及粉丝内的收件箱视频

  4. 用户拉取关注流根据滚动分页获取

推拉模式的选择是需要根据当前项目的数据体量决定的。当前项目体量不大,选择拉模式且设置ttl,过滤不活跃粉丝

收件箱初始化
在这里插入图片描述

拉取关注视频

在这里插入图片描述

分类推送

根据分类随机推送视频,不需要分页,不需要去重,因数据量少

一切的设计实现都要考虑当前项目的因素落地

审核中台

审核中台可自定义放行比例以及设置是否开启审核

在这里插入图片描述

设计

AuditService: 规定审核标准,规定入参返回值 <T,R>

AbstractAuditService: 封装统一逻辑 : 比较得分,获取消息,返回对应审核状态(策略模式)

ImageAuditService: 图片审核

TextAuditService: 内容审核

VideoAuditService: 视频审核

在这里插入图片描述

VideoPublishAuditServiceImpl: 发布视频审核设计

在这里插入图片描述

后台管理界面

权限模块

使用RBAC实现权限模块,超级管理员可自行分配角色

在这里插入图片描述

系统配置

系统配置中配置了审核力度、审核开关、热门视频热度限制、白名单
在这里插入图片描述

视频模块

可对视频进行下架审核处理

在这里插入图片描述

分类模块

可管理首页的分类

在这里插入图片描述

优化记录

架构优化

当前项目为单体架构,后续随着流量的增大会升级为微服务项目,主要服务如下:

  1. 评论服务 :评论服务抽出来是考虑到后续产品会出 动态 功能,因此将评论服务抽出来
  2. 点赞收藏浏览分享服务 :该服务考虑到后续可能会有对视频,动态,评论等有操作
  3. 鉴权服务 :用于对资源的保护
  4. 网关 :路由请求转发
  5. 消息队列:在项目中大量使用了线程解耦,实际引入MQ
  6. 审核服务:在项目中审核的设计为嵌入式服务,应该将其抽出改为单独服务,并且提供更多的信息
  7. 分享服务:分享未做短链接,实际应该做短链接处理,存储视频信息,用户信息等

视频存储优化

项目中Redis有一个分类库,用于存储所有的视频达到随机推送视频,且ttl为-1,项目中未做分片,会造成大key

分片设计

  1. 每个分类维护一个分片id,且限制分片id最大存储X条数据。 数据结构String key: 分类id value: 自增id

  2. 系统启动时将分片id存储本地缓存

  3. 存储视频时,先判断对应分类中的数量是否达到限制

    3.1. 未达到 - 跳到4
    3.2. 达到限制 - 将本地缓存自增1,异步修改Redis对应分类id 跳到4

  4. 获取本地缓存对应分类id

  5. 取对应id内的随机数,达到分片获取数据。如果想避免数据倾斜(随机数很旧,获取视频不是最新),可指定具体id进行获取数据

Feed流优化

当前项目中是以拉模式实现,用户上线后拉取内容且设置ttl。这里应该做成推拉模式,用户发布一个视频后,推送到活跃用户的收件箱,这里的设计是考虑了项目体量决定

对象存储优化

对象存储在项目中是将和资源相关暴露给了前端,实际该尽可能减少暴露

设计

  1. 设计文件表,用于管理所有的文件

  2. 视频表关联文件表, file_id = file_key

  3. 获取资源时根据file_id从文件表中查询file_key进行重定向

  4. 鉴权…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/314343.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#中string.ToUpper()和string.ToLower()的用法

目录 一、关于ToUpper()和ToLower() 1.ToUpper() 2.ToLower() 3.小结 二、实例 三、生成效果 一、关于ToUpper()和ToLower() 1.ToUpper() 使用字符串对象的ToUpper方法可以将字符串中的字母全部转换为大写。 string P_str_book "mingribook".ToUpper()…

redis 从0到1完整学习 (十四):RedisObject 之 ZSet 类型

文章目录 1. 引言2. redis 源码下载3. redisObject 管理 ZSet 类型的数据结构4. 参考 1. 引言 前情提要&#xff1a; 《redis 从0到1完整学习 &#xff08;一&#xff09;&#xff1a;安装&初识 redis》 《redis 从0到1完整学习 &#xff08;二&#xff09;&#xff1a;re…

Python开发环境[PycharmEclipseAnaconda]

Pycharm配置Python开发环境 每种语言的开发工具都有很多&#xff0c;如果写一些小的脚本或者小的工具&#xff0c;建议直接使用命令行或者Python自带的IDLE&#xff0c;如果进行大型的开发工作建议使用Pycharm&#xff0c;当然这属于个人喜好。 虽然Pycharm给了我们一个美观的…

K8s实战入门

1.NameSpace Namespace是kubernetes系统中的一种非常重要资源&#xff0c;它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。 默认情况下&#xff0c;kubernetes集群中的所有的Pod都是可以相互访问的。但是在实际中&#xff0c;可能不想让两个Pod之间进行互相…

Iterator(迭代器) 和 list

Iterator&#xff08;迭代器&#xff09; 和 list 文章目录 一、Iterator&#xff08;迭代器&#xff09;二、list 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、Iterator&#xff08;迭代器&#xff09; 对 collection 进行迭代的迭代器。迭代器…

【Unity入门】UGUI之Slider(滑动条)

目录 一、什么是Slider&#xff1f;二、Slider属性与功能 一、什么是Slider&#xff1f; Slider控件允许用户可以通过鼠标来在预先确定的范围调节数值 我们可以在Hierarchy视图右键 -> UI ->Slider来创建滑动条 通过上图可以发现Unity内置的Slider主要有3部分&#x…

互斥锁-第二十七天

互斥锁 定义&#xff1a;解决临界区最简单的工具&#xff08;一个进程在进入临界区时应获得锁&#xff1b;在退出临界区时释放锁。函数acquire()获得锁&#xff0c;release()释放锁&#xff09; 注意事项&#xff1a;acquire()或release()的执行必须是原子操作&#xff0c;因…

createElement, parentNode, removeChild, appendChild

1获取父节点 var childNode document.getElementById("child"); var parentNode childNode.parentNode; // 获取父节点利用dom获取元素要嵌套 引出&#xff1a;利用父子兄节点关系获取元素 标签&#xff0c;元素&#xff0c;元素节点空格&#xff0c;文本节点属性…

buildadmin实现多级关联下拉效果

文章目录 最终效果开始重新渲染组件编辑渲染完结 最终效果 开始 popupForm.vue代码 <FormItem :label"t(interior.interiorApply.interior_index_id)" type"remoteSelect"v-model"baTable.form.items!.interior_index_id" prop"interi…

Vue:使用IDEA开发Vue的相关配置

一、IDEA无法识别.vue文件 1、IDEA 添加Vue插件 2、添加Vue配置 File | Settings | Editor | File Types 找到 HTML 文件 在下面点号 输入*.vue 二、IDEA无法创建.vue文件 1、问题 在开发过程中&#xff0c;发现创建文件的界面&#xff0c;没有vue模板 2、相关配置 Fi…

MySql——1146 - Table‘mysql.proc‘doesn‘t exit是这个

项目场景&#xff1a; 做自己的小项目需要连接mysql数据库 问题描述 点击数据库时报错 1146 - Table’mysql.proc’doesn’t exit 原因分析&#xff1a; 误删原生的mysql数据库 解决方案&#xff1a; 重新安装装部署mysql就好了 注意不要轻易删除原生的东西

57.网游逆向分析与插件开发-游戏增加自动化助手接口-接管游戏的自动药水设定功能

内容来源于&#xff1a;易道云信息技术研究院VIP课 码云地址&#xff08;master分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号&#xff1a;51307d6bf69f2f3c645c70d09f841f5e32da79b9 代码下载地址&#xff0c;在 SRO_EX 目录下&…