Как кэшировать разбитый на страницы набор запросов 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, теперь я получаю явное сообщение об ошибке «error 10 от memcached_set: SERVER ERROR», возвращаемое в django / core / cache / backends / memcached.py в наборе, строка 78.

Ответы на вопрос(2)

Ваш ответ на вопрос