我们如何忽略NDB缓存的查询结果?

问题描述 投票:1回答:2

我有一个名为SignupTokens的模型,我们正在使用isUsed = True更新实体,当用户从我们的聊天机器人确认他们时,更新实体后如果我们查询未使用的令牌用于特定相同的电子邮件isUsed = False然后一些时间结果甚至返回isUsed标志已经更新为True。当我们遇到这个问题时,我们对数据存储区实体进行双重检查是单一的。

SignupTokens.gql("where isUsed = :1 and email = :2",False,email).get()

我们已经尝试使用use_cache = False了

SignupTokens.gql("where isUsed = :1 and email = :2",False,email).get(use_cache=False)

请让我知道任何人都有这个想法。

python google-app-engine google-cloud-datastore gql
2个回答
2
投票

这很可能不是一个ndb缓存问题,它是由于eventual consistency引起的预期数据存储行为:从实体的isUsed属性设置为True到相应地更新对应于您的查询的索引需要一些时间。

在索引更新之前,查询结果不会反映更改。


1
投票

正如@Dan所说,这很可能不是ndb缓存问题。这是您在连续读写同一实体组时引起的问题。这是一个数据存储行为,主要是由于datastore contentioneventual consistency引起的。

有一些方法可以避免这种情况。

  • 使用key查询。每当你试图通过它的键读取一个对象时,它就是strongly consistent。因此,在您的情况下,我建议存储您正在更新的对象的密钥,如果可能,然后阅读它并执行您想要的操作。
  • 另一种方法是使用NDB异步操作。在这里查看相关的documentation
  • 您可以尝试提供可以帮助您的延迟,但延迟应该以足以使对象更新的方式提供。

希望这能回答你的问题!!!

© www.soinside.com 2019 - 2024. All rights reserved.