besseres Caching...
Verfasst: Samstag 31. Dezember 2011, 14:05
Hab mir mal Gedanken zum Thema Caching gemacht und würde gern eure Meinung hören.
Meine Aktuelle Lösung ist einfach: Alle Requests für Anonyme User cachen. Wenn der Inhalt geändert wurde, wird einfach der komplette Cache gelöscht.
Vorteil: Nie veralteter Cache; sehr hohen Cache-Timeout; Einfach zu Implementieren
Nachteil: Sehr schlecht, bei Frequentierten Seiten: Wenn mehrere Clients kurz nach einem gelöschtem Cache Anfragen stellen, ist die Auslastung sehr hoch, bis der Cache wieder einigermaßen Aufgebaut wurde...
Also sollte man den Cache nicht einfach komplett löschen. Doch wie verhindern das User veraltete Seiten sehen?
Natürlich kann man einfach den Timeout beim Cache sehr niedrig wählen. Aber dann ist er nicht besonders Effektiv.
Als erstes kommt man vielleicht auf die Idee, wirklich nur die geänderten Cache Einträge zu löschen. Aber das ist nicht so einfach wie man denkt. z.B. Ein neuer Blog Eintrag führt ein neues Tag ein. Wo taucht dieser Tag überall auf? Gibt es evtl. eine Seite mit einer "Liste der neusten Änderungen" ? Wenn ja, wo ist diese?
Zweites Beispiel: Man ändert den Slug einer Seite. An welchen Stellen wirkt sich das überall aus? Auf alle Unterseiten. Auf Teile des Hauptmenüs/Sub-Menü und auf alle Links zu dieser Seite und zu allen Unterseiten. Dann noch auf das Sitemap usw...
Eine andere Idee: Man speichert den Zeitpunk der letzten Änderung. Bei jedem Erstellen eines neuen Cache Eintrags (Cache Miss) speichert man auch den Zeitpunkt dazu.
Nun kann man zumindest schnell erkennen, ob beim Cache Hit der Cache Eintrag aktuell oder veraltet ist. Außerdem weiß man wie veraltet er ist.
Nun kann man nicht einfach hingehen und einen Cache Hit der veraltet ist löschen und neu erstellen lassen. IMHO hat man fast das selbe Problem, wie beim komplett löschen.
Die Idee: Man schaut nach wie Ausgelastet das System ist und entscheidet dann, ob man einen veralteten Cache Eintrag ausliefert oder diesen Löscht und neu erstellt.
Die Frage ist, wie stellt man die Auslastung des Systems fest? Eine Idee, wäre auf os.getloadavg() zurück zu greifen.
Man könnte nun beide Werte (Alter des Caches und aktuellen loadavg) ein wenig variable zueinander setzten: Wenn das System stärker ausgelastet ist, wird ein höheres Alter des Caches akzeptiert. Wenn das System quasi Leerlauf hat, dann halt nur ein sehr geringes Alter. Bsp:
Welche Werte wirklich Sinnvoll sind, weiß ich nicht. Kann man ja dann Konfigurierbar machen.
Eine komplett andere Lösung, die auch die beiden Timestaps nutzt: Es wird immer ein Cache-Hit ausgeliefert, egal ob veraltet. Ein Deamon aktualisiert im Hintergrund den Cache kontinuierlich. Dabei kann der sich vom ältesten zum neusten Eintrag vorarbeiten.
Was meint ihr dazu?
Meine Aktuelle Lösung ist einfach: Alle Requests für Anonyme User cachen. Wenn der Inhalt geändert wurde, wird einfach der komplette Cache gelöscht.
Vorteil: Nie veralteter Cache; sehr hohen Cache-Timeout; Einfach zu Implementieren
Nachteil: Sehr schlecht, bei Frequentierten Seiten: Wenn mehrere Clients kurz nach einem gelöschtem Cache Anfragen stellen, ist die Auslastung sehr hoch, bis der Cache wieder einigermaßen Aufgebaut wurde...
Also sollte man den Cache nicht einfach komplett löschen. Doch wie verhindern das User veraltete Seiten sehen?
Natürlich kann man einfach den Timeout beim Cache sehr niedrig wählen. Aber dann ist er nicht besonders Effektiv.
Als erstes kommt man vielleicht auf die Idee, wirklich nur die geänderten Cache Einträge zu löschen. Aber das ist nicht so einfach wie man denkt. z.B. Ein neuer Blog Eintrag führt ein neues Tag ein. Wo taucht dieser Tag überall auf? Gibt es evtl. eine Seite mit einer "Liste der neusten Änderungen" ? Wenn ja, wo ist diese?
Zweites Beispiel: Man ändert den Slug einer Seite. An welchen Stellen wirkt sich das überall aus? Auf alle Unterseiten. Auf Teile des Hauptmenüs/Sub-Menü und auf alle Links zu dieser Seite und zu allen Unterseiten. Dann noch auf das Sitemap usw...
Eine andere Idee: Man speichert den Zeitpunk der letzten Änderung. Bei jedem Erstellen eines neuen Cache Eintrags (Cache Miss) speichert man auch den Zeitpunkt dazu.
Nun kann man zumindest schnell erkennen, ob beim Cache Hit der Cache Eintrag aktuell oder veraltet ist. Außerdem weiß man wie veraltet er ist.
Nun kann man nicht einfach hingehen und einen Cache Hit der veraltet ist löschen und neu erstellen lassen. IMHO hat man fast das selbe Problem, wie beim komplett löschen.
Die Idee: Man schaut nach wie Ausgelastet das System ist und entscheidet dann, ob man einen veralteten Cache Eintrag ausliefert oder diesen Löscht und neu erstellt.
Die Frage ist, wie stellt man die Auslastung des Systems fest? Eine Idee, wäre auf os.getloadavg() zurück zu greifen.
Man könnte nun beide Werte (Alter des Caches und aktuellen loadavg) ein wenig variable zueinander setzten: Wenn das System stärker ausgelastet ist, wird ein höheres Alter des Caches akzeptiert. Wenn das System quasi Leerlauf hat, dann halt nur ein sehr geringes Alter. Bsp:
Code: Alles auswählen
(
(0.2, 2) # loadavg <= 0.2 -> max cache alter >= 2 Sek.
(1.0, 10) # avg >= 1.0 -> cache 10Sek. max
(2.0, 90) # avg >= 2.0 -> cache 90Sek. max
)
Eine komplett andere Lösung, die auch die beiden Timestaps nutzt: Es wird immer ein Cache-Hit ausgeliefert, egal ob veraltet. Ein Deamon aktualisiert im Hintergrund den Cache kontinuierlich. Dabei kann der sich vom ältesten zum neusten Eintrag vorarbeiten.
Was meint ihr dazu?