Basic personligt

Daniels personliga blogg

Smart cache för webapplikationer

Hos Nuby On Rails fanns några coola tips på hur man cachar sina vyer i en Rails-applikation utan att någonsin behöva plocka bort saker manuellt från cachen. Det är annars något av det svåraste att få rätt, speciellt med vyer som innehåller data från flera olika håll. Varje gång det datat ändras, t.ex. antalet kommentarer till ett bloggentry, måste det cachade innehållet tas bort, så att sidan kan skapas på nytt nästa gång den behövs.

Genom att använda en mer komplex nyckel till cachen, i blogg-fallet genom att inkludera både tidsstämpeln för inläggets senaste ändring, antalet kommentarer osv, kommer man automatiskt be om en ny sida när någonting har ändrats. Eftersom de sidor som har funnits i cachen längst utan att efterfrågas är de som tas bort, kommer hela tiden de senaste och mest korrekta sidorna vara de som ligger i cachen. Med en lite modifierad version av hans render_cached() så får man lätt över 100 sidvisningar per sekund på en vanlig Linux-PC, vilket inte är så illa.

För vissa sidor kommer visserligen cache-nyckeln bli ganska lång, men det gör ingenting. Det går fortfarande snabbare att låta Memcache leta upp den färdiga sidan än att behöva skapa om den hela tiden.

Databasen då? Ska man inte cacha sådant också? Nej, förmodligen inte. Det enda man kan cacha på applikationsnivå är sökning efter enstaka objekt, men det gör databasen själv lika bra. För mer komplexa frågor måste man ändå ner i databasen, så det är sällan värt besväret. Då är det billigare att köpa en starkare databasserver. Att hitta saker baserat på vissa villkor är ju det som databaser är bra på.

Självklart måste man veta vad man har att jobba med, så det är viktigt att applikationsmotorn (Rails i mitt fall) loggar hur stor del av tiden som har ägnats i databasen respektive för att bygga html-sidan. Som vanligt när det gäller optimeringar så är det delen som är långsammast som man ska åtgärda först. För RSS/Ping ligger just nu databasen alltid under 25% medan html-byggandet sällan ligger under 50% (Rails plus min kod står för de övriga 25%). Om tiden i databasen försvann skulle den hinna bygga 33% fler sidor, men om den slapp html-delen skulle den hinna med 100% fler sidor.

Man inser sedan ganska snabbt att man måste kunna stänga av cacheningen medan man ändrar på HTML-koden i utvecklingsversionen, annars blir det ganska förvirrande.

Andra bloggar om: , , , , , .

Annonser

december 29, 2007 - Posted by | problemlösning, teknik

1 kommentar »

  1. […] med långa nycklar För några dagar sedan skrev jag om hur praktiskt det är med en smart cache för vyerna i en […]

    Pingback av Memcache med långa nycklar « Basic personligt | januari 1, 2008 | Svara


Kommentera

Fyll i dina uppgifter nedan eller klicka på en ikon för att logga in:

WordPress.com Logo

Du kommenterar med ditt WordPress.com-konto. Logga ut / Ändra )

Twitter-bild

Du kommenterar med ditt Twitter-konto. Logga ut / Ändra )

Facebook-foto

Du kommenterar med ditt Facebook-konto. Logga ut / Ändra )

Google+ photo

Du kommenterar med ditt Google+-konto. Logga ut / Ändra )

Ansluter till %s