Кеширование запросов в Django - PullRequest
2 голосов
/ 11 января 2011

В проекте django мне нужно всего лишь кэшировать несколько запросов, используя из-за ограничений сервера таблицу кэша вместо memcached.

Один из этих запросов выглядит так:

Допустим, у меня есть объект Parent, в котором много объектов Child. Мне нужно сохранить результат простого запроса parent.childs.all().

У меня нет проблем с этим, и все работает, как и ожидалось, с некоторым кодом, подобным

key = "%s_children" %(parent.name)
value = cache.get(key)
if value is None:
  cache.set(key, parent.children.all(), CACHE_TIMEOUT)
  value = cache.get(key)

Но иногда, просто иногда cache.set ничего не делает, и после выполнения cache.set, cache.get(key) продолжает возвращать None.

После некоторого теста я заметил, что cache.set не работает, когда parent.children.all().count() имеет более высокие значения.
Это означает, что если я храню внутри key (например) 600 дочерних объектов, это работает нормально,
но это не будет работать с 1200 детьми.

Итак мой вопрос : есть ли предел для данных, которые может хранить ключ? Как я могу переопределить это?


<ч />
Второй вопрос: какой путь "лучше", код выше или следующий?

key = "%s_children" %(parent.name)
value = cache.get(key)
if value is None:
  value = parent.children.all()
  cache.set(key, value, CACHE_TIMEOUT)

Вторая версия не вызовет ошибок, если cache.set не работает, так что это может быть обходной путь для моей проблемы, но , очевидно, не является решением.

В общем, давайте забудем о моей проблеме, какую версию вы бы посчитали "лучшей"?

Ответы [ 3 ]

2 голосов
/ 12 января 2011

Ваш бэкэнд MySQL?

В MySQL поле TEXT ограничено 65 000 байтов , но django будет использовать этот тип для поля значения.

INSERT & UPDATEзапрос будет молча провален, если ваши данные слишком велики.

Мой совет: пусть ваши данные будут маленькими.Хранение полного QuerySet кажется излишним.Разве вы не можете хранить только обязательные поля?

Как этот запрос

resultset = parent.children.values_list(*fields).all()

будет извлекать необходимые поля, а не полные экземпляры.

0 голосов
/ 11 января 2011

Интересная вещь в memcached - она ​​имеет ограничение в 1 Мбайт относительно того, что может быть сохранено в данном ключе кеша.Вы можете настроить это ограничение, но оно повлияет на переносимость вашего кода, если вы развернете его на сервере, где это значение по умолчанию находится вне вашего контроля.

См. «Хранение списков данных» здесь: http://code.google.com/p/memcached/wiki/FAQ

0 голосов
/ 11 января 2011

Я вижу три возможности. Первое мне кажется наиболее вероятным, поскольку вы сказали, что работаете с ограниченными ресурсами:

  1. Может случиться так, что вам понадобится очень много времени, чтобы получить ваш запрос, закодировать его, а затем сохранить его снова - до тех пор, пока процесс вашего веб-сервера исчерпает память или истечет время ожидания и умрет, прежде чем данные будут сохранены ,

  2. Или, возможно, ваша база данных имеет довольно небольшое ограничение на длину текстового столбца, и хранение 1200 засеченных объектов в кодировке base64 превышает этот предел.

  3. Возможно, ваш ключ кеша превышает 255 символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...