0

我敢肯定,今天的许多在线服务必须执行与我正在做的类似的任务。一个用户有朋友,我想在他们的朋友最后一次状态更新日期之后获取所有用户朋友的所有状态更新。

那是一口,但这是我所拥有的:

一个用户说有 10 个朋友。我想做的是为他所有的朋友获取新的状态更新。所以,我准备了一本包含每个朋友最后状态日期的字典。就像是:

for friend in user:
    dictionary['userId] = friend.id
    dictionary['lastDate'] = friend.mostRecentStatusUpdate.date

然后,在我的服务器端,我做这样的事情:

for dict in friends:
    userId = dict['userId]
    lastDate = dict['lastDate']
    # each get below, however, launches an RPC and does a separate table lookup, so if I have 100 friends, this seems extremely inefficient
    get statusUpdates for userId where postDate > lastDate

上述方法的问题在于,在服务器端,for 循环的每次迭代都会启动一个新查询,该查询会启动一个 RPC。所以如果朋友多的话,就显得效率真的很低了。

有没有更好的方法来设计我的结构以使这项任务更有效率?Twitter 是怎么做这样的事情的,它会在哪里获得新的时间线更新?

4

1 回答 1

1

从高层次来看,我建议您遵循规定的应用程序引擎口头禅 - 使写入变得昂贵以使读取变得便宜。

对于每个朋友,您应该保留一组已知朋友及其最近的状态更新。这将允许您在写入时更新朋友。这对于写入来说是昂贵的,但可以节省您在读取时的处理和查询。这也假设你读的比写的多。

此外,如果您只是想为每个朋友显示 N 个最新更新,我建议您使用NDB Structured 属性来存储 Friend 对象 - 这样您就可以创建匹配的数据结构。作为对象的一部分,创建与状态更新相对应的键集合。写入状态更新时,添加到集合中,并可能删除较旧的条目(如果空间是一个问题)。

这样,当您需要检索更新时,您可以通过键获取它们,而不是更昂贵的查询类型。

避免任何额外查询的替代方法是保留整个更新而不仅仅是键。但是,这对于存储来说会大很多——10 个朋友都相互连接,这意味着同一个更新的 100 个版本。

于 2012-09-18T18:04:05.207 回答