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

How we can ignore NDB cached query result?

我有一个名为 SignupTokens 的模型,当用户从我们的聊天机器人确认他们时,我们正在使用 isUsed = True 更新实体,如果我们使用 isUsed = False 查询特定相同电子邮件的未使用令牌,则在更新实体后一段时间结果回来了,即使 isUsed 标志已经更新为 True。每当我们遇到这个问题时,我们都会仔细检查数据存储实体是单一的。

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

我们已经尝试过 use_cache = False like

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

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

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

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

正如@Dan 所说,这很可能不是 ndb 缓存问题。这是连续读写同一个实体组时出现的问题。这是一个数据存储行为,主要是由于 datastore contention and eventual consistency.

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

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

  • 另一种方法是使用 NDB 异步操作。请参阅此处的相关 documentation

  • 您可以尝试提供延迟,这对您有帮助,但提供延迟的方式应足以让对象得到更新。

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