首页 > 解决方案 > 使用扇出写入方法根据隐私设置(PostgreSQL、Redis)更新 Feed

问题描述

我正在为社交网络规划一个系统设计,在用户(如 Instagram)和他们可以发布的帖子之间建立“关注”关系。

如果用户 A 关注用户 B,则用户 A 可以在其时间轴上看到 B 的所有内容,而不管 B 是否也关注 A。但是,如果 B 决定将其隐私设置设置为 Private,则用户 A 应该无法看到不再是用户 B 的内容。

我想对用户 Feeds/Timelines 使用扇出写入方法(推送方法),即:在 Redis 中存储他们关注的所有人的最新帖子。因此,当用户 A、B 和 C 都关注用户 D,并且用户 D 发布新帖子时,我会更新用户 A、B 和 C 的提要列表。这有助于在 O(1) 中为每个用户获取提要,这很好。

但是,如果用户 D 将他的隐私设置设置为“私人”,并且他只关注用户 B。这意味着现在应该只有用户 B 可以看到他的内容。所以我需要从redis的用户A和C的列表中删除用户D的内容。

但是这样是不是太不靠谱了?如果我们有很多用户和很多追随者,我们能否得到一个边缘案例,在 Redis 完成更新他们的提要列表之前,用户仍然可以看到他们在一段时间内不应该看到的内容?

此外,这意味着如果用户相互关注或只有一个用户关注另一个,我也应该将信息存储在 redis 中。

它是如何在“现实世界”(twitter、facebook、instagram ....)中实现的,我错过了什么吗?

标签: databasepostgresqlredisfeed

解决方案


推荐阅读