twitter - 关注用户时的时间线重构

标签 twitter redis timeline feed

这个问题与this one非常相似,但是没有关于那个的答案。我更清楚地发布了这篇文章,希望能得到答复。

根据 this presentation , Twitter 结合了一种扇出方法,将推文推送到 Redis 中每个用户的时间线。显然,这种扇出只会在您关注的用户发布推文时发生。

假设一个新用户,之前从未关注过任何人(并且在他们的时间线中没有推文),决定关注某人。仅使用上述方法,他们将不得不等到他们关注的用户发了推文,任何内容才会显示在他们的时间线上。经过一番观察,事实并非如此。 Twitter 从用户那里获取最新的推文。

现在假设一个新用户关注了 5 个用户,Twitter 如何组织这些推文并将其推送到 Redis 中的用户时间线中?

假设一个用户已经关注了 5 个用户,并且他们的时间线中有来自这些用户的大量推文。当他们关注另外 5 个用户时,这些用户的个人推文如何以正确的顺序推送到 Redis 中初始用户的时间线中?更重要的是,它如何能够计算从每个用户那里带来多少(看到他们将时间线限制在 800 条推文)。

最佳答案

如果我很好地理解您的问题,这是我将如何尝试实现它的一种方式。

将每条推文存储在哈希中。散列的关键可能是这样的:tweet:<tweetID> . 将给定用户的推文 ID 存储在名为 user:<userID>:tweets 的排序集中.您将推文的分数设置为 unix 时间戳,因此它们以正确的顺序出现。然后,您可以使用指令 ZREVRANGEBYSCORE 获取用户的 800 个最新推文 ID 的列表。

  ZREVRANGEBYSCORE user:<userID>:tweets +inf -inf LIMIT 0 800

当用户关注新人时,您在关注者的时间轴中复制此指令返回的 ID 列表(在应用程序代码中,或使用 LUA 脚本)。这个时间线再次由一个排序集表示,以 unix 时间戳作为分数。如果您在应用程序代码中进行复制(Redis 完全可以接受),请不要忘记使用 pipelining以独特的网络操作在排序集中执行多次写入。它将大大提高性能。

要获取时间线内容,请使用 pipelining也。如果您不想在特定日期之前发布推文,请使用带限制选项和/或时间戳作为下限的 ZREVRANGEBYSCORE 请求推文 ID。

关于twitter - 关注用户时的时间线重构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24701111/

相关文章:

node.js - _http_server.js :192 throw new RangeError (`Invalid status code: ${statusCode}` );

javascript - 生成具有易于区分的类型/组的实体 ID

charts - 通过选择触发谷歌时间线工具提示

javascript - 从 Json 格式的 Javascript 获取数组值

iphone - 如何从我的 iPhone 应用程序中打开 Twitter 应用程序中的 Twitter 页面?

laravel - AWS ElastiCache Redis 无法从 Laravel nad 从 redis-cli 连接

jquery - 格式化 jquery 时间轴?

java - 在 Java 中创建基于时间轴的编辑图形用户界面

Ruby 推特客户端

java - 使用空格和 OR 从 java 调用 Twitter RestAPI