焦点速看:布隆过滤器在短视频 feeds 系统中的妙用
大家平时刷抖音、视频号、快手时,几乎总能刷到最新的视频。那这里是怎么实现的呢?
上述场景,可以简单抽象为曝光去重,就是用户看过的 feeds1、feeds2、feeds3 ...... 等,如何保证在用户下次进入系统时不会再次出现呢?今天,我们就来探讨下几种实现方案吧。
方案一 :Set
这个方案简单粗暴,就是每个用户用一个集合,存储看过的所有 feedsid。每次推荐系统要出新的 feeds 时,去 set 中 check 一下是否存在,如果存在的话,就过滤掉这条 feeds。
【资料图】
一般来说,像是短视频推荐的场景下,对 feeds 的实时性要求相对较高,一般会使用 Redis 作为曝光打击的载体。
不了解 Redis Set 的同学可以参考下:https://redis.io/commands/set/,简而言之就是一个字典。
这种方案的问题是,在海量用户的场景下,1是成本会很高(像 Redis 是纯内存数据库);2是随着 feeds 数量越来越多,set 查询会随之变慢(像短视频的场景下,1晚上刷个上百条还是不成问题的)。
我们来简单试算一下,假设国民级 App 的日活跃用户在 3kw,每人每天平均刷 200 条视频 feeds,每条 feeds 的 id 长度为 32B。
如果以 Redis Set 的方案来计算:3kw * 200 * 32 * 1.5(Redis 数据结构自身存储) ~ 288G,每天需要消耗存储 288G,1个月呢?8.6T,1年呢?103T。以腾讯云 keewiDB 的持久内存来估计 64元/GB/月,1月成本大约 55w,有钱也不能这么造啊。
那有没有更优惠的实现方案呢?这就要说到本文的主角,布隆过滤器了。
方案二:Bloom Filter
布隆过滤器,本质上是一个高阶 Bitmap,最适合的场景就是海量数据的过滤了。
不了解 Bitmap 的同学可以参考 https://www.cnblogs.com/dragonsuc/p/10993938.html。
布隆过滤器介绍
布隆过滤器的结构如下图示:
简单说下它的使用:
1. 写入:对数据 data 进行 k 次 hash 运算(hash 函数可选择,本文不具体较少),得到结果后,对 bit 数组相应位置置1。
2. 检查:对数据 data 同样进行 k 次 hash 运算,得到结果后,检测 bloom bit 数组中相应位置是否全为1,如全是1,则表示该 data 存在于 bloom 中;否则,表示该数据不在 bloom 中。
结合上述描述,我们可以得出如下结论:
1. bloom 中存的摘要,而不是原始数据 data,所以空间占用远远低于 set 的占用。
2. bloom 无法删除数据,如上图示 x、y 都对 bit 数组中 bits[2] 置1了,如果删除 x,则 bits[2]为0,y判定时,也判定失败了。
3. bloom 无法动态扩展大小,如上图示,bit 数组是固定的,如果 bits 数组长度调整了,那么同样的 x、y hash 后的 bits 索引也会发生变化。
4. bloom 存在误判的可能,例如 x、y hash 后得到的 bits 数组索引都是 1、3、5,那么即使 bloom 中只添加了 x,当 y 来判定时,也会判定为存在。
这里不细究它的推导过程了,感兴趣的同学可以自行研究。
布隆过滤器实现曝光打击
由上述布隆过滤器的特性所知:必须合理选择 bloom 过滤器的规格,bloom bit 数组太小,则误判率过高;bloom bit 数组太大,则过于浪费存储。
还是以相同的条件来试算,
假设国民级 App 的日活跃用户在 3kw,每人每天平均刷 200 条视频 feeds,每条 feeds 的 id 长度为 32B。
如果以 Redis bloom 的方案来计算:400B * 3kw ~ 12G,相比 set 方案的 288G,节约了 96% 的存储成本。1月可以节约 52.8w 成本,降本增效杠杠的。
当设置 bloom 容量为 200 时,每人每天1个key,可以保证当天看到不重复的 feeds,BF 规格如下:
采用 Redis Bloom 插件计算,https://redis.io/docs/stack/bloom/。
进一步优化
上述场景下,Bloom 大小按照 200 计算,那活跃用户呢?总有一些高活用户,每天会刷大几百条视频,这部分用户不做特殊处理的话,体验会非常差,后面总是看到重复的视频。还有就是一些特殊场景,例如业务希望用户1月内都不要看到重复的 feeds。这种,如果仅仅以每天每人作为 bloom 的 key,那么实现1个月内不重复,1个用户要查询30个 bloom,有点夸张。
Redis 虽然能抗,但假设用户刷视频的频率是 10w/s,扩散后,对 Redis 的压力就是300w/s
怎么优化呢?有几种思路。
1. 最简单,让 Redis 抗,单机扛不住,分片还扛不住吗?分片扛不住,读写分离还扛不住吗?反正肯定能抗住。
2. 记录1个总数量的 bloom key,分级,递增设置容量。例如起始 bf0 容量是 1000,当 bf0 满了,新建一个 bf1,容量是 10000,bf1 满了,再新建一个 bf2,容量是 10w。这种方案有两个好处,1是递进的增加 bf 容量,减少 Redis 的 key 访问次数,减轻 Redis 的压力;2是不浪费存储,大部分用户都是非活跃用户,可能看到的 feeds 量在 1w 以内,只有真正活跃的用户才会分配 10w 以上的大 bf,精准的占用存储。
至此,本文就大体结束了,后面有时间了再开一篇布谷鸟过滤器的说明,先鸽一下。
标签:
相关文章
焦点速看:布隆过滤器在短视频 feeds 系统中的妙用
上述场景,可以简单抽象为曝光去重,就是用户看过的feeds1、feeds2、feeds3 等,如何保证在用户下次进入系统时不会再次出现呢?今天,
一汽新车要火了!轴距近2.9米,2.0T+8AT,颜值不输哈弗H9
一汽新车要火了!轴距近2 9米,2 0T+8AT,颜值不输哈弗H9随着国内SUV市场的火爆,越来越多的品牌开始插足这个领域。而且随着科技的发展,国产
杭州美莱医疗美容医院有限公司_关于杭州美莱医疗美容医院有限公司简述
1、杭州美莱医疗美容医院有限公司于2014年03月21日在杭州市市场监督管理局登记成立。2、法定代表人林兆晞,公司经营范围包括许可经营项目:医
【世界播资讯】【财经分析】硅谷银行正式倒闭 美联储加息副作用的多米诺骨牌效应已显现?
硅谷银行的倒下反映出美联储收紧货币政策对经济体中一些板块带来的压力已经达到临界水平。
环球时讯:却的部首是木还是夕_却的部首是有几画
1、但是偏旁是两幅画。2、部首:总笔画为。3、偏复句的肯定句中,提出与偏复句相反或不一致的动作、行为或条件,表示转折,相
微动态丨西部最新形势:湖人稳住第九距前6只差1胜场 勇士跌第7开拓者掉队
西部最新形势:湖人稳住第九距前6只差1胜场勇士跌第7开拓者掉队,湖人,勇士,快船队,利拉德,76人队,波特兰开拓者,多伦多猛龙队,明尼苏达森林狼队
03月11日07时许昌最新疫情防疫管控出入政策通知 每日热闻
2023年03月11日07时许昌今日疫情最新动态消息及许昌出行进出返乡最新疫情防疫管控出入政策通知。本次许昌出现防疫政策
世界球精选!一岁半宝宝突然呕吐怎么办_一岁半宝宝突然呕吐怎么解决
1、一岁半宝宝突然呕吐。2、需要注意的是,可能是消化不良。3、如果伴有腹泻、腹痛、腹胀等。4、可能需要给予助消化药物,如
环球快消息!memory是什么意思翻译_memory是什么意思
1、名词n 1 记忆;记忆力2 记忆的范围3 留在记忆中的人(或事物);回忆4 纪念5 死后的名声6 【生
中国最大的汽车城,曾做过首都,火车站修了20年还没修好_天天关注
创意坊旅游带你发现不一样的中国美。以前人们的出行都是依靠马车、自行车,汽车在生活中非常少见。但随着人们生活水平的不断提升,很多人结婚
微积分 各专业通用 数学基础研究_世界观热点
1、《微积分(各专业通用)(数学基础研究)》是中国人民大学出版社2013年9月出版的图书。2、作者是陈余泉。本文到此
美原油交易策略:全球股市普遍下跌,油价延续跌势_环球快看
周五(3月10日)亚洲时段,美原油延续跌势,一度创近两周新低至74 93美元 桶附近,因为交易商对美联储频繁和更大幅加息
天天关注:河南发现春秋战国之交戎人墓 墓葬及器物特点已有中原化趋势
3月8日,记者从在河南郑州举行的2022河南考古新发现论坛上获悉,该省三门峡市陕州城墓地中发现较多夫妻并穴合葬墓及少量工
世界速看:福晶科技3月10日盘中涨幅达5%
以下是福晶科技在北京时间3月10日10:49分盘口异动快照:3月10日,福晶科技盘中涨幅达5%,截至10点49分,报18 59元,成交2 74亿元,换手率3 55%
天天播报:如何减少咸菜的亚硝酸盐_怎样降低咸菜中亚硝酸盐的含量
1、酸洗时间在2天以内或超过20天:2、其实咸菜的亚硝酸盐含量在腌制的2天内并不是很高,然后亚硝酸盐含量在第3-8天达到
阳了应该怎么办-阳性感染者如何用药 03月10日00时四川巴中疫情数据|全球热头条
青壮年一般高烧阶段不超过3天,到第4、第5天会明显好转。如高烧持续3天以上,且没有缓解趋势,建议前往医院就诊。一、03月10日00时四川巴中通
促销、内部价,黄牛盯上汽车代购,交易需谨慎 焦点热文
华夏时报(www chinatimes net cn)记者刘凯于建平北京报道有需求就会有市场,随着汽车的普及度逐渐增高,也给无孔不入的投机者找到了新的商机
高中生学好语文的方法及技巧_高中语文学习方法_天天报资讯
1、高中语文学习方法指导 高中的语文学习与初中有很大不同,涉及的学习内容要增加很多。2、是学生盛宴中思维最活跃、表达能
世界今日报丨gyta/gyts-gyts和gyta有什么区别
1、GYTS光缆是架空或者是直埋用的光缆,GYTA光缆是架空或者是穿管道用的光缆。2、一个是可以直接埋地里,另一个是要穿管道的,理论来说是不能
环球微速讯:今日时讯:怎么知道感染了甲流 感染了甲流怎么办
小伙伴们好,带大家回顾下怎么知道感染了甲流感染了甲流怎么办,那么小纵今天就来梳理下具体的一些信息一起来看看吧。一、怎么
无主之地2武器代码怎么写进去_无主之地前传武器代码怎么用
1、复制输入就可以了你要先学会,修改器,就会用代码了去3DM下载作弊器。2、打开人物存档,打开人物武器界面,替换武器代码