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

时间:2019-02-26 04:43:46

标签: python google-app-engine google-cloud-datastore gql

我有一个称为SignupTokens的模型,当用户从我们的聊天机器人确认其身份时,我们将使用isUsed = True更新实体,更新实体后,如果我们使用isUsed = False查询特定同一电子邮件的未使用令牌,则得出一些结果返回,即使有wasUsed标志已经用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)

请让我知道有人对此有想法。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

如@Dan所建议,这很可能不是ndb缓存问题。这是连续读取和写入同一实体组时引起的问题。这是一种数据存储行为,主要是由于 datastore contention eventual consistency

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

  • 使用key查询。每当您尝试通过其键读取对象时,它就是strongly consistent。因此,在您的情况下,建议您尽可能存储要更新的对象的密钥,然后再读取它并执行所需的操作。

  • 另一种方法是使用NDB异步操作。在此处查看相关的 documentation

  • 您可以尝试提供可以帮助您的延迟,但是应以足以使对象更新的方式提供延迟。

希望这能回答您的问题!