django-hosting.de

Einzelne Views mit cache_page und Memcached cachen

Zuerst einmal müssen ein paar Einträge in der settings.py gemacht werden, damit man das Cache-Framework von Django benutzen kann. In meiner settings.py steht jetzt folgendes:

CACHE_BACKEND = 'memcached://127.0.0.1:11211/'
CACHE_MIDDLEWARE_PREFIX = 'myproject'
CACHE_MIDDLEWARE_SECONDS = 60

Der View den man cachen möchte wird mit dem cache_page Decorator versehen. (Die Python 2.4 Syntax @cache_page() funktioniert zumindestens mit Django 0.96.1 nicht)

from django.views.decorators.cache import cache_page

def myview(request):
    #do something
    return render_to_resonse('template', context)

myview = cache_page(myview, 60*60) # <- hier wird gecached

Eine Middleware sorgt dafür das nach dem Editieren von Objekten die gecachte Variante des Views gelöscht wird.

Zuerst wird der Edit-View etwas bearbeitet:

object.save()
request.session['purge'] = page.slug # <- der entscheidende Teil
return HttpResponseRedirect("/foo/%s/" % page.slug)

Und dann wird die folgende Middleware aktiviert. Durch den Redirect nach dem Speichern und den Wert in der Session wird durch die Middleware der Cache gelöscht (und der Wert aus der Session wieder entfernt).

from django.utils.cache import get_cache_key
from django.core.cache import cache

class CachePurgeMiddleware(object):
    def process_request(self, request):
        if 'purge' in request.session:
            k = get_cache_key(request)
            try:
                cache.delete(k)
            except:
                pass
            del request.session['purge']

To be continued ...

Benchmarks

Eine kurze Messung mit ab -n 200 -c 20 (Apache Bench) brachte folgendes Ergebnis:

Ohne Caching:

HTML transferred:       735600 bytes
Requests per second:    47.23 [#/sec] (mean)

Mit Caching:

HTML transferred:       751548 bytes
Requests per second:    831.58 [#/sec] (mean)

Den Status des Memcache Daemons kann man wunderbar mit diesem View anzeigen lassen: http://effbot.org/zone/django-memcached-view.htm

View Plain  |  Index  |  Home

Showing: head, History: head [8]