django querysets + memcached: лучшие практики

Пытаюсь понять, что происходит во время низкоуровневого cache.set () django В частности, подробности о том, какая часть набора запросов сохраняется в memcached.

Во-первых, правильно ли я интерпретирую документы django?

  • набор запросов (объект python) имеет / поддерживает свой собственный кеш
  • доступ к базе данных ленив; даже если queryset.count равен 1000, если я сделаю object.get для 1 записи, то доступ к базе данных будет только один раз для этой 1 записи.
  • при доступе к представлению django через apache prefork MPM каждый раз, когда конкретный экземпляр демона X вызывает конкретное представление, которое включает что-то вроде "tournres_qset = TournamentResult.objects.all () ", в результате каждый раз будет создаваться новый объект tournres_qset . То есть все, что могло быть кэшировано внутренне объектом python tournres_qset из предыдущего (tcp / ip) посещения, вообще не используется tournres_qset нового запроса.

Теперь вопросы о сохранении вещей в memcached в представлении. Допустим, я добавляю что-то вроде этого в верхней части представления:

tournres_qset = cache.get('tournres', None)
if tournres_qset is None:
    tournres_qset = TournamentResult.objects.all()
    cache.set('tournres', tournres_qset, timeout)
# now start accessing tournres_qset
# ...

Что сохраняется во время кеширования.set ()?

  • Будет ли сериализован и сохранен весь набор запросов (объект python)?

  • Поскольку набор запросов еще не использовался для получения каких-либо записей, не является ли это пустой тратой времени, поскольку на самом деле содержимое конкретной записи не сохраняется в кэше памяти? (Любые будущие запросы будут получать объект набора запросов из кэша памяти, который всегда будет запускаться заново, с пустым локальным кешем набора запросов ; доступ к базе данных будет всегда.)

  • Если указанное выше верно, тогда я должен просто всегда повторно сохранять набор запросов в конце представления, после того, как он использовался во всем vierw для доступа к некоторым записям, что приведет к локальному кешу набора запросов чтобы получать обновления, и какие из них всегда следует повторно сохранять в memcached? Но тогда это всегда приводило к повторной сериализации объекта набора запросов. Вот и все для ускорения.

  • Или же cache.set () заставляет объект набора запросов выполнять итерацию и обращаться из базы данных ко всем записям, которые также будут сохранены в кэше памяти ? Все будет сохранено, даже если представление обращается только к подмножеству набора запросов?

Я вижу подводные камни во всех направлениях, что заставляет меня думать, что я
неправильно понимаю кучу вещей.

Надеюсь, что это имеет смысл, и ценим пояснения или указатели на некоторые "стандартные" рекомендации. Спасибо.

16
задан oblivion02 1 August 2017 в 20:36
поделиться