vivo 短视频推荐去重服务的设计实践

Python微信订餐小程序课程视频

https://edu.csdn.net/course/detail/36074

Python实战量化交易理财系统

https://edu.csdn.net/course/detail/35475

一、概述

1.1 业务背景

vivo短视频在视频推荐时需要对用户已经看过的视频进行过滤去重,避免给用户重复推荐同一个视频影响体验。在一次推荐请求处理流程中,会基于用户兴趣进行视频召回,大约召回2000~10000条不等的视频,然后进行视频去重,过滤用户已经看过的视频,仅保留用户未观看过的视频进行排序,选取得分高的视频下发给用户。

1.2 当前现状

当前推荐去重基于Redis Zset实现,服务端将播放埋点上报的视频和下发给客户端的视频分别以不同的Key写入Redis ZSet,推荐算法在视频召回后直接读取Redis里对应用户的播放和下发记录(整个ZSet),基于内存中的Set结构实现去重,即判断当前召回视频是否已存在下发或播放视频Set中,大致的流程如图1所示。

图片

(图1:短视频去重当前现状)

视频去重本身是基于用户实际观看过的视频进行过滤,但考虑到实际观看的视频是通过客户端埋点上报,存在一定的时延,因此服务端会保存用户最近100条下发记录用于去重,这样就保证了即使客户端埋点还未上报上来,也不会给用户推荐了已经看过的视频(即重复推荐)。而下发给用户的视频并不一定会被曝光,因此仅保存100条,使得未被用户观看的视频在100条下发记录之后仍然可以继续推荐。

当前方案主要问题是占用Redis内存非常大,因为视频ID是以原始字符串形式存在Redis Zset中,为了控制内存占用并且保证读写性能,我们对每个用户的播放记录最大长度进行了限制,当前限制单用户最大存储长度为10000,但这会影响重度用户产品体验。

二、方案调研

2.1 主流方案

第一,存储形式。视频去重场景是典型的只需要判断是否存在即可,因此并不需要把原始的视频ID存储下来,目前比较常用的方案是使用布隆过滤器存储视频的多个Hash值,可降低存储空间数倍甚至十几倍。

第二,存储介质。如果要支持存储90天(三个月)播放记录,而不是当前粗暴地限制最大存储10000条,那么需要的Redis存储容量非常大。比如,按照5000万用户,平均单用户90天播放10000条视频,每个视频ID占内存25B,共计需要12.5TB。视频去重最终会读取到内存中完成,可以考虑牺牲一些读取性能换取更大的存储空间。而且,当前使用的Redis未进行持久化,如果出现Redis故障会造成数据丢失,且很难恢复(因数据量大,恢复时间会很长)。

目前业界比较常用的方案是使用磁盘KV(一般底层基于RocksDB实现持久化存储,硬盘使用SSD),读写性能相比Redis稍逊色,但是相比内存而言,磁盘在容量上的优势非常明显。

2.2 技术选型

第一,播放记录。因需要支持至少三个月的播放历史记录,因此选用布隆过滤器存储用户观看过的视频记录,这样相比存储原始视频ID,空间占用上会极大压缩。我们按照5000万用户来设计,如果使用Redis来存储布隆过滤器形式的播放记录,也将是TB级别以上的数据,考虑到我们最终在主机本地内存中执行过滤操作,因此可以接受稍微低一点的读取性能,选用磁盘KV持久化存储布隆过滤器形式的播放记录。

第二,下发记录。因只需存储100条下发视频记录,整体的数据量不大,而且考虑到要对100条之前的数据淘汰,仍然

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值