Cómo almacenar en caché un queryset Django paginado

¿Cómo se almacena en caché un queryset Django paginado, específicamente en un ListView?

Noté que una consulta tardaba mucho tiempo en ejecutarse, así que estoy intentando almacenarla en caché. El queryset es enorme (más de 100k registros), por lo que estoy intentando almacenar en caché solo subsecciones paginadas. No puedo almacenar en caché la vista completa o la plantilla porque hay secciones que son específicas del usuario / sesión y deben cambiar constantemente.

ListView tiene un par de métodos estándar para recuperar el queryset,get_queryset(), que devuelve los datos no paginados, ypaginate_queryset(), que lo filtra por la página actual.

Primero traté de almacenar en caché la consulta enget_queryset(), pero rápidamente se dio cuenta de que llamabacache.set(my_query_key, super(MyView, self).get_queryset()) estaba causando que toda la consulta fuera serializada.

Así que entonces traté de anularpaginate_queryset() me gusta:

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

Sin embargo, esto tarda casi un minuto en ejecutarse, aunque solo se recuperan 10 objetos, y cada solicitud muestra "re-caching", lo que implica que no se está guardando nada en el caché.

Misettings.CACHE parece:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '127.0.0.1:11211',
    }
}

yservice memcached status muestra memcached se está ejecutando ytail -f /var/log/memcached.log No muestra absolutamente nada.

¿Qué estoy haciendo mal? ¿Cuál es la forma correcta de almacenar en caché una consulta paginada para que no se recupere todo el conjunto de consultas?

Edición: creo que puede haber un error en memcached o en el contenedor de Python. Django parece admitir dos backends de memcached diferentes, uno que usa python-memcached y otro que usa pylibmc. Python-memcached parece ocultar silenciosamente el error que almacena en la cachépaginate_queryset() valor. Cuando cambié al backend pylibmc, ahora recibo un mensaje de error explícito "error 10 de memcached_set: ERROR DE SERVIDOR" que remonta a django / core / cache / backends / memcached.py en conjunto, línea 78

Respuestas a la pregunta(2)

Su respuesta a la pregunta