DokuModi der Dateiseiten
ISR (stale-while-revalidate)
Definition
ISR speichert den HTML-Code einer Seite pro URL zwischen und stellt ihn bereit, bis das Fenster abläuft. Die abgelaufene Kopie wird weiterhin bereitgestellt, während eine neue im Hintergrund gerendert wird: das ist stale-while-revalidate.
Wie es funktioniert
revalidate = N im Titelblatt einer .nexy-Seite schaltet es ein. N ist eine Anzahl von Sekunden; Ein fehlender, null oder negativer Wert bedeutet, dass überhaupt kein Cache vorhanden ist.
Der Cache-Schlüssel ist nur der Anfragepfad - request.scope["path"]. Die Abfragezeichenfolge ist nicht Teil davon.
| Was | Wert |
|---|---|
| Geben Sie | den URL-Pfad ein (/blog/hello) |
| Speicherung | im Speicher, im Prozess, der die Seite rendert |
| Gebunden | 256 Einträge pro Prozess, am längsten nicht genutzt, entfernt |
| Antwortheader | cache-control: public, s-maxage=N, stale-while-revalidate=N |
Rendering-Lebenszyklus
- Es kommt eine Anfrage für eine Seite, die
revalidatedeklariert. - Noch kein Eintrag: Die Seite wird gerendert, gespeichert und zurückgegeben.
- Eintrag jünger als
NSekunden: wird unverändert zurückgegeben, die Seite wird nicht gerendert. - Eintrag älter als
NSekunden: Der veraltete-Eintrag wird sofort zurückgegeben und eine Hintergrundaufgabe rendert einen neuen. - Wenn das Hintergrund-Rendering ansteigt, bleibt der veraltete Eintrag bestehen und die nächste veraltete Anfrage versucht es erneut.
Wann zu verwenden
- Der gleiche HTML-Code für jeden Besucher: ein Blog-Beitrag, eine Produktseite, eine Dokumentationsseite.
- Die Seite wird oft gelesen und ändert sich selten.
- Die Daten können einige Sekunden alt sein, ohne dass es jemand merkt.
Konfiguration
revalidate = 60<h1>Rendered at most once per minute</h1>N ist eine einfache Ganzzahl. An anderer Stelle gibt es keine Überschreibung pro Route, und .py-Handler sind keine Seiten: Sie gelangen nie in diesen Cache.
Beispiel
Ein Blogbeitrag, der eine Datenbank liest:
revalidate = 300slug: prop[str] = "untitled"posts = {"hello": {"title": "Hello"}, "other": {"title": "Other"}}post = posts.get(slug, {"title": "Untitled"})<h1>{{ post.title }}</h1>Die erste Anfrage an /blog/hello wird gerendert und gespeichert. Die nächsten 300 Sekunden werden aus dem Speicher bereitgestellt. /blog/other ist ein separater Eintrag, der eigenständig gerendert und gespeichert wird. In einem realen Projekt stammt posts aus einer Datenbank oder einem Dienst, der einmal pro Regeneration aufgerufen wird.
Einschränkungen
Nexy garantiert, dass der Cache-Schlüssel der Pfad ist, die veraltete Kopie während der Neugenerierung bereitgestellt wird und der Speicher begrenzt und threadsicher ist.
Laut Konvention ist eine Seite, die revalidate deklariert, öffentlicher Inhalt. Schreiben Sie es so, als würde jeder Besucher den gleichen HTML-Code sehen.
Ihre Bewerbung ist für alles Weitere verantwortlich:
| Grenze | Was es bedeutet |
|---|---|
| Abfragezeichenfolge ignoriert | /search?q=a und /search?q=b teilen sich einen Eintrag. Speichern Sie keine Suchseite im Cache. |
| Sitzung nicht isoliert | Die Antwort lautet public und der HTML-Code des ersten Besuchers wird allen bereitgestellt. Lesen Sie die Sitzung niemals auf einer Seite mit revalidate. |
| Keine serverseitige Invalidierung | Nichts löscht einen Eintrag, bevor sein Fenster endet. revalidate(...) innerhalb einer Aktion weist den Browser nur an, einen Pfad neu zu laden; Dieser Cache wird nicht berührt. |
| Ein Cache pro Prozess | Mehrere Worker unterhalten mehrere Caches mit unterschiedlichem Inhalt. |
| Gleichzeitige Regenerationen | Nichts dedupliziert sie: Zehn veraltete Anfragen können zehn Renderings starten. |
| Fehler bleiben stumm | Eine fehlgeschlagene Neugenerierung stellt weiterhin die alte Seite bereit; Der Fehler wird protokolliert und nicht zurückgegeben. |