Notes on caching

In een vorige post heb ik toegelicht hoe je caching kan toevoegen aan Django (en in de toekomst zal ik een post maken hoe je ook kan cachen op de webserver). Ik heb wat geƫxperimenteerd met caching en ik heb enkele dingen geleerd.

there are two things hard in computer science: cache invalidation and naming things
— Phil Karlton

Wat te cachen

Statische assets (CSS, Javascript etc) kunnen eigenlijk permanent gecached worden (of toch een langere periode, zoals een maand of een jaar), idealiter ook op de client. Alle andere inhoud moeten we mee opletten.

De homepagina op een drukbezochte site heeft vaak wel baat bij volledig gecached te worden (ook door downstream caches zoals de webserver of een CDN), maar eigenlijk enkel als de site geregeld bezoekerspieken krijgt. Pagina’s die niet veel bezoek krijgen worden beter niet gecached, omdat de kans groot is dat de gecachede versie nooit gebruikt zal worden.

Dure databasequeries worden vaak best gecached, net als externe API calls. Deze worden best gecached in bijvoorbeeld memcached voor zolang het acceptabel is dat deze gegevens “out of date” zijn, bijvoorbeeld 5 tot 10 minuten.

Cachen om te cachen is vaak de moeite niet, als een gecachede pagina nooit cache hits krijgt word er enkel geheugen verspild. In zo’n geval word er beter gekeken naar het optimaliseren van de site/code.

Cache toevoegen aan Django

Een cache toevoegen kan een enorme performantieboost zijn voor een website. Django maakt het eenvoudig om een cache toe te voegen, het laat out of the box 3 manieren om te cachen toe:

  • Volledige site caching (elke pagina krijgt dezelfde behandeling)
  • Per view caching (Er kan per view bepaald worden of er gecached moet worden, en voor hoelang)
  • Low level caching (waar individuele objecten of databasequeries gecached kunnen worden.

Als ik bij een test applicatie per-view caching toevoeg als test, kan ik op een VM met 2 cores 600 requests/seconde verwerken in plaats van 200/seconde. In deze post zal ik toelichten hoe je per-view caching kan implementeren binnen Django

Lees verder