这个问题与this one非常相似,但是那个问题没有答案。我更清楚地发布了这个,希望得到答案。
根据this presentation,Twitter采用扇出方法将推文推送到Redis中每个用户的时间线。显然,这种扇出只发生在你正在跟踪推文的用户时。
假设一个以前从未跟踪任何人的新用户(并且相反,他们的时间表中没有推文)决定跟随某人。使用上述方法,他们将不得不等到他们跟随的用户发送了一些东西,以便在他们的时间线上显示任何内容。经过一番观察,情况并非如此。 Twitter从用户那里获取最新的推文。
现在假设一个新用户跟随5个用户,Twitter如何组织并将这些推文推送到用户在Redis中的时间线?
假设用户已经关注了5个用户,并且他们在时间轴中有来自这些用户的大量推文。当他们关注另外5个用户时,这些用户的个人推文如何以正确的顺序进入Redis的初始用户时间线?更重要的是,它如何计算每个用户引入的数量(看到他们将时间线限制为800个推文)。
答案 0 :(得分:0)
如果我理解你的问题,这是一种如何实现它的方法。
将每条推文存储在哈希中。哈希的关键可能是:tweet:<tweetID>
。
将给定用户的推文的ID存储在名为user:<userID>:tweets
的有序集中。您将推文的分数设置为unix时间戳,因此它们以正确的顺序显示。然后,您可以使用指令ZREVRANGEBYSCORE
ZREVRANGEBYSCORE user:<userID>:tweets +inf -inf LIMIT 0 800
当用户关注新人时,您可以在关注者的时间轴中(在应用程序代码中或使用LUA脚本)复制此指令返回的ID列表。此时间轴再次由排序集表示,其中unix时间戳为分数。如果您在应用程序代码中执行复制(Redis完全可以接受),请不要忘记使用pipelining在唯一网络操作中的有序集中执行多次写入。它将大大提高性能。
要获取时间轴内容,请同时使用pipelining。如果您不希望在特定日期之前发布推文,请使用带限制选项的ZREVRANGEBYSCORE和/或时间戳作为下限来请求推文ID。