这是我参与「第五届青训营 」伴学笔记创作活动的第 12 天
我在此次简版抖音后端开发中主要负责视频相关功能以及评论相关功能
视频相关功能包括:
- 刷新视频(Feed,返回给定时间戳前的三十条视频)
- 用户上传视频(Publish)
- 用户视频列表(PublishList)
评论相关功能包括:
- 发布评论(AddComment)
- 删除评论(DeleteComment)
- 视频评论列表(CommentList)
刷新视频
看到业务需求首先思考对应sql语句
SELECT * from videos WHERE created_at < latest_time ORDER BY created_at DESC LIMIT 30
复制代码
注意其中的DESC倒序是应该要输出最新的30条视频而不是最旧的30条视频。但显然上述语句并不够高效,在不考虑分布式的情况下,我们的视频都是顺序插入的,也就是说并不需要排序。但是因为不知道给出的参数latest_time在表中的位置(第几行,没记错的话innodb不存行数),也就没有办法直接通过offset去定位返回的视频集。最容易想到的提升效率的方法就是给created_at建立索引,但显然,作为短视频app中调用最频繁的接口,上述操作在高并发场景下很难胜任
不难想到用redis中的有序集合去完成这样一个feed的功能。有序集合的score用时间戳,value就存视频的id即可。这样就可以通过zrevrangebyscore函数去在返回给定时间戳范围内(0,latest_time)的30条视频。
用户上传视频
不同于前面的feed功能,此功能首先应该校验用户的登陆状态,根据客户端传来的token判断用户是否有相应权限。上传视频涉及到文件存储,首先应该再中间件中的校验文件的格式大小等等,确保安全性。为了适应海量存储的场景,也可以使用课中讲述的对象存储,因为有经济成本,我们并没有使用。完成文件存储后,再写入mysql以及redis。(后续下个笔记说)