Caching von Sitemaps in Django

8

Ich habe eine einfache Sitemap-Klasse mit der Standard-Sitemap-App von django implementiert. Da die Ausführung sehr lange dauerte, habe ich das manuelle Caching hinzugefügt:

%Vor%

Das Problem ist, dass Memcache nur maximal 1 MB Objekt erlaubt. Dieser war größer als 1 MB, daher ist das Speichern im Cache fehlgeschlagen:

%Vor%

Das Problem ist, dass Django eine automatisierte Methode hat, zu entscheiden, wann die Sitemap-Datei in kleine Dateien aufgeteilt werden soll. Laut den Dokumenten ( Ссылка ):

  

Sie sollten eine Indexdatei erstellen, falls vorhanden   Ihrer Sitemaps hat mehr als 50.000   URLs. In diesem Fall wird Django   paginiert automatisch die Sitemap,   und der Index wird das widerspiegeln.

Was wäre Ihrer Meinung nach der beste Weg, um Caching-Sitemaps zu aktivieren? - Hacking in das Django-Sitemaps-Framework, um eine einzelne Sitemap-Größe auf, sagen wir, 10.000 Datensätze zu beschränken, scheint die beste Idee zu sein. Warum wurden 50.000 ausgewählt? Google-Tipp? Zufallszahl? - Oder gibt es eine Möglichkeit, Memcached Store größere Dateien zu ermöglichen? - Oder vielleicht Onces gespeichert, sollten die Sitemaps als statische Dateien zur Verfügung gestellt werden? Das würde bedeuten, dass ich anstatt mit memcached manuell die Ergebnisse im Dateisystem ablegen und sie von dort beim nächsten Aufruf der Sitemap abrufen müsste (vielleicht das Verzeichnis täglich in einem Cron-Job bereinigen).

All diese scheinen sehr niedrig und ich frage mich, ob eine offensichtliche Lösung existiert ...

    
michuk 19.12.2015, 11:31
quelle

4 Antworten

14

50k ist kein Hardcore-Parameter. :)

Sie können stattdessen diese Klasse django.contrib.sitemaps.GenericSitemap

verwenden %Vor%     
Oduvan 23.03.2010, 10:45
quelle
2

Wenn Sie davon ausgehen, dass Sie nicht alle diese Seiten in Ihrer Sitemap benötigen, funktioniert die Reduzierung der Dateigröße wie in der vorherigen Antwort beschrieben.

Wenn Sie eine sehr große Sitemap haben möchten und memcached verwenden möchten, können Sie den Inhalt in mehrere Blöcke aufteilen, sie unter einzelnen Schlüsseln speichern und sie dann bei der Ausgabe wieder zusammenfügen. Um dies effizienter zu machen, unterstützt Memcached die Möglichkeit, mehrere Schlüssel gleichzeitig zu bekommen, obwohl ich mir nicht sicher bin, ob der django Client diese Fähigkeit bereits unterstützt.

Als Referenz ist das 1-MB-Limit eine Funktion von memcached, um zu erfahren, wie Daten gespeichert werden: Ссылка

    
Garethr 26.03.2010 23:48
quelle
1

Ich habe ungefähr 200.000 Seiten auf meiner Seite, also musste ich den Index haben, egal was. Ich habe den obigen Hack gemacht, die Sitemap auf 250 Links beschränkt und auch einen dateibasierten Cache implementiert.

Der grundlegende Algorithmus ist dies:

  • Versuchen Sie, die Sitemap aus einer Datei auf der Festplatte zu laden
  • Wenn dies fehlschlägt, generieren Sie die Sitemap und
  • Wenn die Sitemap 250 Links enthält (die oben angegebene Anzahl), speichern Sie sie auf der Festplatte und geben Sie sie dann zurück.

Das Endergebnis ist, dass das erste Mal, wenn eine Sitemap angefordert wird, diese vollständig generiert und auf der Festplatte gespeichert wird. Wenn es das nächste Mal angefordert wird, wird es einfach von der Festplatte geliefert. Da sich meine Inhalte nie ändern, funktioniert das sehr gut. Wenn ich jedoch eine Sitemap ändern möchte, ist es so einfach, die Dateien von der Festplatte zu löschen und darauf zu warten, dass die Crawler Dinge neu generieren.

Der Code für das Ganze ist hier, wenn Sie interessiert sind: Ссылка

Vielleicht ist das auch eine gute Lösung für Sie.

    
mlissner 19.08.2010 07:56
quelle
1

Sie können Sitemaps auch im gzip-Format bereitstellen, was sie viel kleiner macht. XML eignet sich perfekt für die gzip-Komprimierung. Was ich manchmal mache: Erstellen Sie die gezippten Sitemap-Dateien in einem Cronjob und rendern Sie diese so oft wie nötig. Normalerweise wird einmal am Tag ausreichen. Der Code dafür könnte so aussehen. Stellen Sie sicher, dass Ihre sitemap.xml.gz von Ihrem Domain-Root-Server bereitgestellt wird:

%Vor%

Damit sollten Sie beginnen.

    
Simon Steinberger 06.12.2015 22:10
quelle

Tags und Links