抖音项目实现构思与优化以及数据库设计 | 青训营笔记

548 阅读4分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第5篇笔记

成果展示

  • 后端服务器部署地址
  • 项目github地址
  • 手机演示视频
  • 实现功能
功能项说明
视频Feed流、视频投稿、个人信息支持所有用户刷抖音,按投稿时间倒序推出,用用户可以自己拍视频投稿,查看自己的基本信息和投稿列表
点赞列表、用户评论登录用户可以对视频点赞,并在视频下进行评论,在个人主页能够查看点赞视频列表。
关注列表、粉丝列表登录用户可以关注其他用户,能够在个人信息页查看本人的关注数和粉丝数,点击打开关注列表和粉丝列表。

小组分工

  • 数据库设计
  • 接口测试
  • app测试方法

    • app测试本地接口方式:

      • 用自己手机连接本地局域网,并运行go项目,让其通过防火墙
      • 设计安装apk文件,并长按“我的”,设置电脑局域网ip地址和端口
    • app测试远程调试方法:

      • 长按“我的”,设置地址
  • 安全性设计
  • Readme文档:
  • 接口分工

    • 实现了APP所有的接口,所有的接口测试通过

项目介绍

系统架构

目录结构

  • docs

    • postman-export:postman接口测试文件导出
    • sql:数据库初始化sql和运维sql
  • src

    • api

      • controller:控制器
      • router.go:路由器控制
    • cache

      • user_id:通过用户id缓存用户数据
      • user_uname_pwd:通过用户名密码缓存用户数据
    • dao:数据访问层,与数据库相关的操作

    • global:全局变量

    • pkg

      • errcode:统一错误码
      • setting:配置文件映射
    • pojo

      • entity:数据层对象,映射数据库表
      • vo:视图层对象,映射接口返回对象
    • service:项目核心业务逻辑

    • util:工具类

    • config.yaml:配置文件

    • init.go:初始化加载文件

    • server.go:启动类

相关优化

对象存储

  • 使用阿里云 OSS 对象存储对视频进行存储,使用在线截图工具截取视频封面,通过网络IO流转存图片,返回视频和和图片的访问链接

JWT权限认证

  • 使用 JWT对用户进行权限认证,在服务器端保管密钥,并控制 token 有效时间

GO协程优化

  • 使用 Go 协程并行查询数据库信息,使得原本封装视频 feed 流信息等需要多条 sql 的操作的需求,简化为只需要2~3条 sql 操作就能完成

    • 服务端向数据库同时发送 2~3 条 sql,在服务端对返回结果进行异步封装,节省了网络传输的时间
    • 定义计时器,如果超时直接返回错误码,提高接口反应速度

自定义缓存

  • 自定义缓存,手动实现 LRU 缓存算法,将用户信息进行在服务端缓存,避免频繁查询数据库

    • 保证并发安全,新增节点、删除节点等操作进行加锁
    • 保证数据一致性,当关注/取消关注等操作导致用户信息变化时,删除缓存中的用户数据,等下次查询的时候再从数据库中获取最新数据加到缓存中

数据库事务

  • 使用数据库事务保证同时对多张表进行操作正确

    • 同时操作多张表数据,如果其中一个出错,事务进行回滚操作
    • 保证数据有效性,服务端控制不能重复点赞、重复关注、自己关注自己等操作
    • 使用CAS操作,保证数据一致性,避免频繁操作导致数据异常

SQL预编译

  • 项目中的SQL语句全部实现了预编译,防止SQL注入风险

数据库设计

  • 详细设计

  •   dy_user表 用户表 | 字段名 | 类型 | 说明 | | -------------- | ----------- | -------- | | id | bigint | | | username | varchar(40) | | | password | varchar(40) | | | follow_count | int | 关注其他用户个数 | | follower_count | int | 粉丝个数 | | create_date | datetime | | | update_date | datetime | | | is_deleted | tinyint | |

  • dy_video | 字段名 | 类型 | 说明 | | -------------- | ------------ | ------ | | id | bigint | | | user_id | bigint | | | play_url | varchar(255) | 视频链接 | | cover_url | varchar(255) | 封面链接 | | favorite_count | int | 点赞个数 | | comment_count | int | 评论数 | | title | varchar(255) | 视频标题 | | create_date | datetime | | | update_date | datetime | | | is_deleted | tinyint | |

  • dy_comment 评论表 | 字段名 | 类型 | 说明 | | ----------- | ------------ | ------- | | id | int | | | video_id | bigint | 评论的视频id | | user_id | bigint | 评论的用户 | | content | varchar(255) | 评论内容 | | create_date | datetime | | | update_date | datetime | | | is_deleted | tinyint | |
  • dy_favorite 点赞表 | 字段名 | 类型 | 说明 | | ---------- | ------- | ------ | | id | int | | | user_id | bigint | | | video_id | bigint | | | is_deleted | tinyint | |
  • dy_relation 关系表 | 字段名 | 类型 | 说明 | | ------------ | -------- | ------------- | | id | int | | | follower_id | bigint | 用户id | | following_id | bigint | 对方的id | | create_date | datetime | | | update_date | datetime | | | is_deleted | tinyint | 数据存在则用户关注了这个人 |

  • 学习资料: