Как кэшировать разбитый на страницы набор запросов Django
Как вы кешируете постраничный набор запросов Django, особенно в ListView?
Я заметил, что выполнение одного запроса занимало много времени, поэтому яЯ пытаюсь его кешировать. Набор запросов огромен (более 100 тыс. Записей), поэтому яЯ пытаюсь только кэшировать его подразделы. Я могу'• кэшировать весь вид или шаблон, потому что есть разделы, которые зависят от пользователя / сеанса и должны постоянно меняться.
ListView имеет несколько стандартных методов для получения набора запросов,get_queryset()
, который возвращает не разбитые на страницы данные, иpaginate_queryset()
, который фильтрует его по текущей странице.
Сначала я попытался кэшировать запрос вget_queryset()
, но быстро поняла, зоветcache.set(my_query_key, super(MyView, self).get_queryset())
вызывал сериализацию всего запроса.
Итак, я попытался переопределитьpaginate_queryset()
лайк:
import time
from functools import partial
from django.core.cache import cache
from django.views.generic import ListView
class MyView(ListView):
...
def paginate_queryset(self, queryset, page_size):
cache_key = 'myview-queryset-%s-%s' % (self.page, page_size)
print 'paginate_queryset.cache_key:',cache_key
t0 = time.time()
ret = cache.get(cache_key)
if ret is None:
print 're-caching'
ret = super(MyView, self).paginate_queryset(queryset, page_size)
cache.set(cache_key, ret, 60*60)
td = time.time() - t0
print 'paginate_queryset.time.seconds:',td
(paginator, page, object_list, other_pages) = ret
print 'total objects:',len(object_list)
return ret
Тем не менее, это займет почти минуту, хотя извлекается только 10 объектов, и каждый запрос показывает "повторное кэширование», подразумевая, что ничего не сохраняется в кеш.
мойsettings.CACHE
похоже:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': '127.0.0.1:11211',
}
}
а такжеservice memcached status
показывает, что memcached запущен иtail -f /var/log/memcached.log
абсолютно ничего не показывает.
Что я делаю неправильно? Как правильно кэшировать разбитый на страницы запрос, чтобы весь набор запросов нет восстановлен?
Редактировать: Я думаю, что они могут быть ошибкой в memcached или в оболочке Python. Похоже, что Django поддерживает два разных бэкэнда memcached, один из которых использует python-memcached, а другой - pylibmc. Кажется, что python-memcached молча скрывает ошибку, кеширующуюpaginate_queryset()
значение. Когда я переключился на бэкэнд pylibmc, теперь я получаю явное сообщение об ошибке "ошибка 10 из memcached_set: SERVER ERROR " прослеживание до набора django / core / cache / backends / memcached.py в строке 78.