更新:我重读了您的帖子,发现您不想将它们全部放在同一个实体组中。如果不这样做,我不确定如何保证强一致性。您可能希望重组数据,以便不必将它们放在同一个实体组中,而是放在多个实体组中。也许取决于一组 Person 实体的某些方面? (例如,他们所在的邮件列表、正在发送的电子邮件类型等)每个人是否仅包含姓名和电子邮件地址,或者是否涉及其他属性?
Google suggests a a few other alternatives:
如果您的应用程序可能会遇到较重的写入使用,您可能需要考虑使用其他方式:例如,您可以将最近的帖子放入具有过期时间的 memcache 并显示最近的混合来自 memcache 和 Datastore 的帖子,或者您可以将它们缓存在 cookie 中,在 URL 中放置一些状态,或完全其他的东西。目标是找到一个缓存解决方案,在用户发布到您的应用程序的时间段内为当前用户提供数据。请记住,如果您在事务中执行 get、put 或任何操作,您将始终看到最近写入的数据。
所以看起来您可能想要调查这些可能性,尽管我不确定它们能在多大程度上转化为您的应用所需的内容。
原始帖子:使用ancestor queries.
来自 Google 的"Structuring Data for Strong Consistency":
要获得高度一致的查询结果,您需要使用祖先查询将结果限制为单个实体组。这是有效的,因为实体组是一致性和事务性的单位。所有数据操作都应用于整个组;在整个实体组更新之前,祖先查询不会返回其结果。如果您的应用程序依赖于某些查询的高度一致的结果,您可能需要在设计数据模型时考虑到这一点。本页讨论了构建数据以支持强一致性的最佳做法。
因此,当您创建 Person 实体时,请为其设置父级。我相信你甚至可以让一个特定的实体成为所有其他实体的“父母”,它应该给你很强的一致性。 (尽管我喜欢用祖先来构建我的数据。)
# Gives you the ancestor key
def ancestor_key(kind, id_or_name):
return db.Key.from_path(kind, id_or_name)
# Kind is the db model your using (should be 'Person' in this case) and
# id_or_name should be the key id or name for the parent
new_person = Person(your_params, parent=ancestor_key('Kind', id_or_name)
您甚至可以在此时对具有相同父级的所有实体进行查询,这很好。但这应该有助于您获得更一致的结果。