Feed Flow 准备工作 - 推荐设计
发布于 Aug 22, 2020 by ThinkCat.
重复率低的推荐
实现
为了简单快速做到推荐的内容,用户浏览后,就不会或者极少概率再次看到。采用布隆过滤器方式。
实现原理:维护一个已读集合,里面有10亿个元素,每次给接收人推队列的时候,监测这个接收人的这个消息是不是在这个集合中,不在的话再推给该人的队列。
过滤器元素: receiverID+feedId。
流程
用户拉取到了信息,那么这条信息就可以标记为已读。用户队列正常发送最新信息,放入前也保证信息是不包括已读的。
推送消息
- 消息产生:推给receiverId, 该用户必须在线,不在线不推送。检查(receiverId+feedId)是否是已读的,非已读的,才会往receiverId的队列中放消息(最新消息)
- 补充推送:按规则获取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脚本。