Views-Caching-Strategien - Beziehung zwischen Abfrage-Cache und gerendertem Ausgabecache

7

Zunächst versuche ich, die Sorgfaltspflicht sicherzustellen und keine doppelten Fragen zu stellen, die zuvor gestellt wurden. Es gibt zahlreiche Beiträge zu Stackexchange und zu verschiedenen anderen Stellen, in denen das Zwischenspeichern von Ansichten und sogar einige Besonderheiten der verschiedenen Arten von Ansichts-Caches (z. B. hier und hier ) erläutert werden . Ich habe jedoch noch keine Details gefunden, die die Beziehungen zwischen verschiedenen Ebenen des Zwischenspeicherns von Ansichten und die möglichen Auswirkungen auf fallspezifische Caching-Entscheidungen ausreichend erklären . Der Einfachheit halber konzentriere ich mich im Rahmen dieser Frage auch auf sofort einsatzbereite 7.x-3.x-Caching-Optionen, unabhängig von anderen Ebenen, die im Contrib-Bereich angeboten werden.

Views stellt zwei Ebenen des zeitbasierten Caching für jede Anzeige bereit, einen Cache "Abfrageergebnisse" und einen Cache "gerenderte Ausgabe". Die Einzelheiten darüber, welche Rohdaten jeder Cache umfasst, sind klar, die Art und Weise, wie sie interagieren, jedoch nicht. Ich frage mich speziell, ob ein Treffer im gerenderten Cache den Abfrage-Cache vollständig umgeht oder ob die beiden Ebenen separat arbeiten. Ich habe einige Referenzen gesehen, die das erstere beanspruchen (wie dieses ), und einige, die das letztere beanspruchen (wie dieses hier ).

Theorie 1 - Separate Cache-Ebenen

Ich war zunächst unter dem Eindruck (und hoffen) , dass jede Schicht einzeln „in der Reihe“ aufgerufen wird, und dass die gerenderte Ausgabe - Cache - Hashes die eigentliche Abfrage Ergebnisse innerhalb seiner cids. Auf diese Weise hätte ich eine elegante Möglichkeit, die teuerste Lade- / Erstellungsarbeit nach der Abfrage zwischenzuspeichern und gleichzeitig sicherzustellen, dass neuer Inhalt sofort in der Ansicht angezeigt wird (Cache "Abfrageergebnisse" aus und Cache "gerenderte Ausgabe" ein ). Einige schnelle Tests haben ergeben, dass dies möglicherweise nicht möglich ist, da der gerenderte Ausgabecache möglicherweise nicht über die aktuellen Abfrageergebnisse informiert ist.

Theorie 2 - Der gerenderte Ausgabecache "umfasst" den Abfrageergebniscache

Die andere Möglichkeit besteht darin, dass der gerenderte Ergebniscache durch einen Hash der Abfrage selbst (nicht durch die Ergebnisse) verschlüsselt wird. Wenn dies der Fall wäre, könnte ein Treffer die gerenderte Ausgabe direkt zurückgeben, ohne den Abfragecache oder die Datenbank zu konsultieren. Wenn dies der Fall wäre, wäre es wahrscheinlich nicht sinnvoll, den Cache "Abfrageergebnisse" mit einem Zeitintervall festzulegen, das kleiner ist als der Cache "Gerenderte Ergebnisse". Der Vorteil wäre natürlich, dass man die gerenderte Ausgabe häufiger aktualisieren könnte (wenn sie viele dynamische Themenlogik oder häufige Entitätsaktualisierungen haben), während direkte Abfragen an die Datenbank vermieden werden. Für alle außer den komplexesten Ansichtsabfragen scheint diese Art der Trennung jedoch nicht allzu vorteilhaft zu sein.

Ich habe einige "Black-Box" -Tests durchgeführt, die auf Theorie 2 verweisen, bin mir jedoch nicht sicher, ob andere Einstellungen im Spiel sind oder ob die Antwort je nach Ansichtsversion unterschiedlich ist. Ich habe den Code auch ein wenig untersucht, aber ich finde es frustrierend, dass die Plugin-Methoden der meisten Ansichten nicht dokumentiert und gelegentlich schwer zu befolgen sind. Egal was, ich denke, die Antwort darauf wäre nützlich, um sie als Referenz für andere zu haben.

rjacobs
quelle
Aus Erfahrung bin ich mir ziemlich sicher, dass es sich um Theorie 2 handelt. Ich werde versuchen, etwas Zeit zu finden, um sie später zu überprüfen (falls jemand sie noch nicht geklärt hat). Dies wäre in der Tat eine sehr nützliche Referenz
Clive
In dem einen Beitrag heißt es: Der Render-Cache für Ansichten verwendet die Ergebnismenge einer Abfrage als Cache-Schlüssel. Wenn ich nur die gerenderte Ausgabe zwischenspeichere (1 Stunde) und neuen Inhalt hinzufüge, wird dieser Inhalt nicht angezeigt. Was darauf hindeutet, dass die Ergebnismenge nicht der Cache-Schlüssel ist.
J. Reynolds
Ja, beide obigen Kommentare weisen auf die Theorie hin, dass jede Ebene separat genutzt werden kann. Ich habe nur gezögert, zu dieser Schlussfolgerung zu gelangen, da ich widersprüchliche Notizen zu diesem Thema gefunden habe. Ich frage mich wirklich, ob sich Ansichten <7.x-3.x anders verhalten haben, was zu Verwirrung führt. Selbst wenn dies wirklich der Fall ist, würden sich Kommentare darüber, wann es gerechtfertigt ist, unterschiedliche Einstellungen für jede Ebene zu haben, als sehr nützlich erweisen.
Rjacobs

Antworten:

4

Ich habe einige der internen Ansichten untersucht, und soweit ich kann, gibt es Elemente aus jeder Theorie, die korrekt sind, aber keines ist 100% genau. Es scheint, dass beide Caching-Ebenen getrennt sind und immer in Reihe geprüft werden, sodass der Cache "gerenderte Ausgabe" die Abfrageebene nicht wirklich "umgehen" kann. Darüber hinaus machen die Abfrageergebnisse nicht faktor bei keinem Cache - Schlüssel, so dass Änderungen an Abfrageergebnissen leider keine Aktualisierung in der gerenderten Ausgabe auslösen.


7.x-3.x

Der Cache "Abfrageergebnisse" wird verwaltet view::execute()und der Cache "gerenderte Ausgabe" wird verwaltet view::render(). Da execute()der Cache-Treffer "gerenderte Ausgabe" vor der Cache-Logik "gerenderte Ausgabe" aufgerufen wird, kann er die Abfrageschicht nicht umgehen. Mir ist nicht ganz klar, warum es etwas verschwenderisch erscheint, eine Abfrage auszuführen oder sogar einen Abfrage-Cache zu überprüfen, wenn die Anzeige nur vollständig aus einem Cache erstellt wird. Ich vermute, dass es eine Menge anderer Logik gibt view::execute()(Zugriffsprüfungen, Hooks, Plugin-Verwaltung), die immer unabhängig vom Caching ausgeführt werden muss, und der Cache-Teil "Abfrageergebnisse" konnte nicht einfach davon getrennt werden. Wie auch immer, dieses Detail berührt die Frage ein wenig, aber vielleicht könnte jemand anderes es kommentieren.

In Bezug auf die Cache-Schlüssel werden beide Cache-Ebenen durch den Ansichtsnamen, den Anzeigenamen, den Cache-Typ und dann einen Hash einer Reihe von kontextbezogenen "Dingen" aus verschlüsselt views_plugin_cache::get_cache_key(). Ein Blick auf diese get_cache_key()Methode ist aufschlussreich, da sie zeigt, dass einige häufig verwendete Kontextdaten immer berücksichtigt werden (Benutzerrollen, Sprache, base_url), aber der Fall "gerenderte Ausgabe" geht noch ein Stück weiter, indem auch die rohe Abfragezeichenfolge gehasht wird. aber nicht die Abfrageergebnisse. Wenn sich die Rohabfrage ändert, wird die gerenderte Ausgabe aktualisiert. Wenn sich jedoch die Abfrageergebnisse ändern, wird die gerenderte Ausgabe weiterhin aus dem Cache zurückgegeben.

Ich denke also, dass aus Sicht der Leistung jede Cache-Ebene wirklich unabhängig behandelt werden kann, aber der Cache "gerenderte Ausgabe" bestimmt immer noch am direktesten, wie oft "veraltete" Daten angezeigt werden. Ich könnte weiter folgern:

  • Das Aktualisierungsintervall für die Basisliste der Elemente in der Ansicht ist größer oder gleich dem Cache-Intervall (die tatsächliche Liste der Elemente kann erst aktualisiert werden, wenn beide Caches für eine bestimmte Ansicht ablaufen).
  • Wenn der Cache "gerenderte Ausgabe" für eine bestimmte Ansicht vor dem Cache "Abfrageergebnisse" aktualisiert wird, wird die Liste der Elemente nicht aktualisiert, der für jedes Element angezeigte Inhalt kann jedoch (dh ein neues Element, das vor 5 Sekunden noch zur Liste hinzugefügt wurde) wird nicht angezeigt, aber Teaser-Text, der vor 5 Sekunden für ein Element in der Liste aktualisiert wurde, wird aktualisiert.
  • Selbst wenn der Cache "Abfrageergebnisse" die endgültige Ausgabe nicht beeinflusst, bietet er dennoch eine Leistungssteigerung für view::execute().

Es ist auch erwähnenswert, dass ein Teil dieses Verhaltens durch lokales Überschreiben von Methoden in der Klasse views_plugin_cache geändert werden kann, z views_plugin_cache::get_cache_key().

8.0.0

Ab 8.0.0-beta7 behält Views (Core) die Option für zeitbasiertes Caching bei. Soweit ich das beurteilen kann, wird es sich wie 7.x-3.x verhalten, aber es ist wirklich zu früh, um abschließende Tests durchzuführen - siehe diese Metadiskussion . Es ist jedoch klar, dass viele der Bedenken und Einschränkungen beim zeitbasierten Caching von Ansichten möglicherweise nicht mehr bestehen, da D8-Ansichten anscheinend auch das tagbasierte Caching unterstützen. Dies sollte eine Möglichkeit für einen wirklich intelligenten Ablauf zwischengespeicherter Daten bieten.

rjacobs
quelle