Как мы можем игнорировать результат кэшированного запроса NDB? - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть модель с именем RegistrationTokens, мы обновляем сущность с помощью isUsed = True, когда пользователь подтверждает их из нашего чат-бота, после обновления сущности, если мы запрашиваем неиспользуемый токен для конкретного сообщения электронной почты с isUsed = False, то через некоторое время получается результатназад даже был флаг isUsed, уже обновленный с True.У нас есть двойная проверка в объекте хранилища данных, который является единичным в то время, когда мы сталкиваемся с этой проблемой.

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

Мы уже пытались использовать _cache = False, как

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

Пожалуйста, дайте мне знатьлюбой имеет представление об этом.

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Как предположил @Dan, это, скорее всего, не проблема ndb кэширования.Эта проблема возникает, когда вы постоянно читаете и пишете одну и ту же группу сущностей.Это поведение хранилища данных, которое в основном вызвано из-за конкуренции за хранилище данных и возможная согласованность .

Есть несколько способов избежать этой ситуации.

  • Запрос с использованием key.Всякий раз, когда вы пытаетесь прочитать объект с помощью его ключа, это strongly consistent.Итак, в вашем случае я бы предложил сохранить ключ объекта, который вы обновляете, если это возможно, а затем прочитать его и выполнить необходимые операции.

  • Другой подход заключается виспользовать NDB Asynchronous Operations.См. Соответствующую документацию здесь.

  • Вы можете попытаться указать задержку, которая может помочь вам, но задержка должнабыть предоставлено таким образом, что для обновления объекта достаточно.

Надеюсь, что это отвечает на ваш вопрос !!!

0 голосов
/ 26 февраля 2019

Скорее всего, это не проблема кэширования ndb, это ожидаемое поведение хранилища данных из-за возможной согласованности : пройдет некоторое время с момента, когда свойство isUsed объекта установлено на True, доИндекс, соответствующий вашему запросу, обновляется соответствующим образом.

До обновления индекса результаты запроса не будут отражать изменения .

...