Was ist die beste Vorgehensweise zum Zwischenspeichern von paginierten Suchergebnissen, deren Reihenfolge / Eigenschaften geändert werden können?
Angenommen, in meiner Bewerbung möchte jemand die letzten 20 Diskussionsthreads sehen (von 10.000). Eine Anforderung würde an die Datenbank gesendet servlet
, um die ersten 20 Datensätze als XML / JSON aus der Diskussionsthread-Tabelle abzurufen. Wenn sie dann die nächsten 20 sehen möchten, gehen sie zur nächsten Ergebnisseite und dies löst eine weitere Anfrage aus, um das nächste Los zu erhalten (Limit und Offset = 20 usw.).
Um die Serverlast und das Warten auf den Client zu reduzieren, möchte ich die vorherigen Ergebnisseiten zwischenspeichern. Ich habe jedoch zwei Fragen:
- Die Tabelle, in der die Ergebnisse angezeigt werden, kann nach mehr als einem Attribut sortiert werden (z. B. Erstellungsdatum des Threads, Autor des Threads, Datum des letzten Beitrags). Dies bedeutet, dass eine Aussage wie 'erste 20 Ergebnisse' ohne Kontext keinen Sinn ergibt (dh nach was bestellen wir). Wie kommuniziert das Front-End dann mit dem Back-End, was es bereits geladen hat? Mein erster Gedanke war, IDs für jedes Ergebnis zu verwenden, aber das Zurücksenden dieser IDs an den Server bei nachfolgenden Anforderungen (und das Filtern der darauf basierenden Ergebnisse) wäre genauso zeitaufwändig wie das blinde Zurücksenden aller Daten. Wie kann ich das machen?
- Was ist, wenn sich ein Attribut eines zuvor zurückgegebenen Ergebnisses (dh des letzten Nachdatums) geändert hat? Wir müssen dann jedes Ergebnis überprüfen, um festzustellen, ob es seit der Auslagerung serverseitig geändert wurde. Wie kann ich das tun?
ajax
caching
pagination
Warenquishy
quelle
quelle
Antworten:
Es scheint , was Sie brauchen , um ein Wrapper für alle Parameter, die eine Seite definieren (sagen sie
pageNumber
,pageSize
,sortType
,totalCount
, etc.) und verwenden diesesDataRequest
Objekt als Schlüssel für Ihren Caching - Mechanismus. Ab diesem Punkt haben Sie eine Reihe von Optionen, um den Cache zu verwalten:Die ersten beiden können einen Scheduler-Mechanismus beinhalten, der in einem bestimmten Intervall oder basierend auf einem Ereignis ausgelöst wird. Der letzte ist möglicherweise einfacher, wenn Sie einen einzelnen Datenzugriffspunkt haben.
Schließlich kann es, wie @DanPichelman erwähnte, schnell zu einem übermäßig komplizierten Algorithmus werden, der die Vorteile überwiegt. Stellen Sie daher sicher, dass der Leistungsgewinn die Komplexität des Algorithmus rechtfertigt.
quelle
Ich würde wahrscheinlich so damit umgehen:
quelle
Nur ein Gedanke - übergeben Sie in Ihrem Serveraufruf die üblichen Parameter sowie ein Array von MD5-Hashes, die aktuell zwischengespeicherte zuvor angezeigte Datenseiten darstellen.
Der Rückruf würde alle üblichen Daten für die neue aktuelle Seite sowie Aktualisierungen für veraltete zuvor angezeigte Seiten enthalten. Sie können den alten Hash als Schlüssel verwenden.
Ich würde zuerst viele Leistungs- und Timing-Tests empfehlen - Ihr clientseitiger Code wird viel komplizierter sein, als wenn Sie einfach für jede Datenseite auf den Server klicken würden. Stellen Sie sicher, dass die zusätzliche Komplexität zu einer bedeutenden Verbesserung führt.
quelle