С NDB Кэширование :
NDB управляет кэшем для вас. Существует два уровня кэширования:
контекстный кеш и шлюз к стандартному кешированию App Engine
сервис, memcache. Оба кэша включены по умолчанию для всех объектов
типы, но могут быть настроены в соответствии с продвинутыми потребностями.
Мое приложение не вносит никаких изменений в конфигурацию кэширования ndb, поэтому оно должно использовать значения по умолчанию - оба уровня кэширования включены.
Я выполняю некоторые тесты в моей промежуточной среде (отдельный, выделенный проект GAE), где я могу полностью изолировать последовательности действий от любых побочных внешних запросов.
Каждая последовательность действий состоит из каскада push-задач, запускающих друг друга, создающих несколько сотен изменчивых сущностей, изменяющих некоторые из них разное число раз, считывающих их все переменное число раз и, наконец, удаляющих их все ,
Только несколько других уже существующих объектов доступны во время последовательности, все они сохраняются после окончания последовательности. Количество обращений к постоянным объектам должно быть значительно меньше количества обращений к изменчивым объектам.
Подавляющее большинство операций чтения - это поиск объектов по ключу или идентификаторам, полученный из запросов keys_only
или других связанных объектов.
Я не использую происхождение сущности. Большинство из этих задач выполняют межгрупповые транзакции, и я часто вижу сбои / повторные попытки транзакций из-за конфликта данных на нескольких «горячих» объектах (я бы оценил около 200-400 из них в этом прогоне, трудно подсчитать в Страница журнала Stackdriver).
После выполнения одной такой ~ 20-минутной последовательности заново после ежедневного сброса квоты на панели инструментов приложения отображается в 3 раза больше операций чтения из облачного хранилища данных (0,03 миллиона), чем из записи в облачное хранилище данных (0,01 миллиона). Число изменчивых объектов указывается удалением объекта хранилища данных Cloud (0,00089 миллионов), если это имеет значение.
Частота обращений к memcache составила 81%, но я не знаю, предназначено ли это только для явного использования memcache в моем приложении или оно включает использование memcache в ndb.
Некоторые ранее подобные измерения, но не в такой чистой среде, дали похожие результаты, я сделал это чистое в качестве проверки.
Эти наблюдения появляются , чтобы предположить, что чтение объекта из кэша все еще считается как чтение хранилища данных. Но здесь я предполагаю, что:
- в течение этих ~ 20 минут не было много выселений memcache (у приложения нет выделенной корзины memcache).
- каждая операция записи делает недействительной кэш-память, поэтому для обновления кэша требуется чтение хранилища данных, но последующие операции чтения должны поступать из кэша (до следующей операции записи), что должно привести к довольно сопоставимому общему чтению и число записей, если считанные кэшированные данные не учитываются
- мой (довольно сложный) код приложения действительно выполняет то, что я описываю:)
Я не нашел ничего об этом в документации, поэтому мне интересно, знает ли кто-то , что кэшированные чтения ndb действительно считаются чтением хранилища данных или могут указывать на недостатки в моей интерпретации или какой-либо официальной документации по субъект.