UP | HOME

Feed Flow 准备工作 - 推荐设计
发布于 Aug 22, 2020 by ThinkCat.

Table of Contents

重复率低的推荐

实现

为了简单快速做到推荐的内容,用户浏览后,就不会或者极少概率再次看到。采用布隆过滤器方式。

实现原理:维护一个已读集合,里面有10亿个元素,每次给接收人推队列的时候,监测这个接收人的这个消息是不是在这个集合中,不在的话再推给该人的队列。

过滤器元素: receiverID+feedId。

流程

用户拉取到了信息,那么这条信息就可以标记为已读。用户队列正常发送最新信息,放入前也保证信息是不包括已读的。

推送消息

  1. 消息产生:推给receiverId, 该用户必须在线,不在线不推送。检查(receiverId+feedId)是否是已读的,非已读的,才会往receiverId的队列中放消息(最新消息)
  2. 补充推送:按规则获取feed,推送到队列。或许会存在性能问题。

拉取消息

拉取到消息,标记消息已读。同时将拉取的消息从队列中移除,再发起【补充推送】。

redis里面创建了一个10亿数量的已读集合,0.0001误差率的过滤器,内存使用是 2.40G。这个量级可以接受。再说这个10亿的已读量,按100w活跃用户,每人一天读100条,10天才会占满。10天后,该过滤器作废,再重建集合(可能会导致10天前的数据会重新推送给用户)

复杂情况

产生消息的数据量,远远低于拉取量,会导致用户队列中内容为空,即是:无新增的消息。

Redis 布隆过滤器模块

安装

git clone https://github.com/RedisBloom/RedisBloom.git
cd RedisBloom
make

启动

安装后,在 RedisBloom 目录中,生成 redisbloom.so 文件,拷贝到 redis 目录下,启动 redis 时候进行加载。

# 在redis目录下
./src/redis-server --loadmodule ./redisbloom.so

该命令可以做成一个shell脚本。

详细参考:https://oss.redislabs.com/redisbloom/Quick_Start/