随机推流 | 青训营笔记

194 阅读2分钟

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

在做青训营的结营项目时,需要实现一个推流的功能,最简单的算法当然是从视频库里随机抽几个视频出来推送,但实际上怎么从视频数据库里随机抽取视频也是值得细究的。

接口描述

下面简要介绍一下这个接口。根据接口描述,该接口不限制登录状态,返回按投稿时间倒序的视频列表,视频数由服务端控制,单次最多30个。

那么在选取视频时,我们首先采用了随机推流的策略。

随机推流

一般来说,视频流的推送应由推荐算法来决定。在本项目中,由于项目设计较为简洁,加上视频、用户量不足,不足以收集足够的特征来训练一个推荐算法。因此,本项目采用随机推流的方式。即便如此,随机推流也有一定的难点。

难点具体表现在如何在数据库中随机选取特定数量的视频记录。一般来说,我们可以通过以下语句来随机查询五条记录:

SELECT * 
FROM video
ORDER BY RAND() 
LIMIT 5 

然而ORDER BY 语句需要对全表排序,因此当视频数据量达到万、十万、百万等级别时,这个语句执行时间会很长(几秒)。这显然会带来不好的用户体验,因此需要优化一下随机查询的思路。

由于本项目没有模拟这么大的数据量,这里假设每天/周都有许多新视频投稿,那么我们可以建立一个基于投稿时间戳的索引(每天/周更新),根据该索引在最近一天/周的所有视频的id ,再用返回go中执行随机取样(比如取10条),再根据这10个id来取数据。这样一来,数据读取都是基于索引来操作,速度会快很多,同时能够保证给用户推送最新的视频,在用户体验上也会好很多。

展望

想象一下,我们是否可以将推荐算法也写进这个后台中,这样就能使得视频的推送更精准。然而,这需要在App端收集相关数据,形成一定量的特征,用推荐算法形成用户画像,再通过召回、排序等粗排序、精排序策略等完成最后的视频流推送。