2009-05-26 11 views
2

ich zur Zeit über Caching-Strategien denke und was noch wichtiger ist jede Vervielfältigung von Daten innerhalb des Cache zu vermeiden. Meine Anfrage ist irgendwie sprachunabhängig, aber sehr programmierbezogen.Caching-Strategien mit Paged/Gefilterte Daten

Meine Frage ist in Bezug auf die effiziente Zwischenspeicherung von ausgelagerten oder gefilterten Daten, aber mehr als das, verteilte Caching. Letzteres habe ich beschlossen, mit Memcached und genauer gesagt einen .NET-Port davon zu gehen. Ich habe eine andere kommerzielle Option in Form von NCache gesehen, aber Memcached scheint vollkommen akzeptabel zu sein und wird anscheinend auf Facebook, Myspace usw. verwendet.

Meine Abfrage ist dann eine Strategie, die Sie Objekte im Cache und auch eine Referenz auf sie mit ausgelagerten Daten. Wenn ich 100 Elemente habe und sie page, kann ich die IDs von Produkt 1-10 im Cache zwischenspeichern und jedes Produkt einzeln zwischenspeichern. Wenn ich, wo die Gegenstände sortieren absteigend dann 10.01 Artikel verschiedene Produkte sein würde, damit ich nicht den tatsächlichen Objekte jedes Mal, wenn die ausgelagerten Daten/Sortieren/Filtern geändert speichern möchten, sondern die IDs der Objekte gespeichert, so konnte ich dann Führen Sie eine trabasale Suche in der Datenbank aus, wenn einige von ihnen nicht bereits im Cache vorhanden sind oder ungültig sind.

Meine ursprüngliche Idee war, diese für einen Cache-Schlüssel.

paged_<pageNumber><pageSize><sort><sortDirection>[<filter>] 

ich dann durch den Cache-Schlüssel laufen würde, und entfernen Sie die letztlich beginnen mit „paged_“ Meine Frage, wenn ein von irgendwelchen Mustern oder Vorstellungen über straties bezüglich Caching solcher Muster von Daten wie ausgelagerten Daten kennt und stellen Sie auch sicher, dass Objekte nicht mehr als einmal zwischengespeichert werden.

memcached ist systemeigener Code und hätte kein Problem, den Cache auf die oben beschriebene Weise zu löschen, aber es ist eine offensichtliche Tatsache, dass je mehr Elemente im Cache, desto mehr Zeit benötigt wird. Ich bin interessiert, wenn irgendjemand irgendeine Lösung oder Theorie für diese Art von Problem kennt, das gegenwärtig angewendet wird. Ich bin mir sicher, dass es sein wird. Vielen Dank für Ihre Zeit

TIA

Andrew

+0

Sind die Seiten dynamisch, wird die Daten auf jeder Seite ständig ändernden oder ist es auf einer Benutzerabfrage basiert? Ist die Anwendung bereits geschrieben und zu langsam, weshalb ein Cache benötigt wird? "Vorzeitige Optimierung ist die Wurzel allen Übels" – Gandalf

+0

Die Daten werden in einem vordefinierten Satz von Optionen geändert und nicht in der Benutzerabfrage zwischengespeichert. Die Anwendung wird erstellt. Dies ist keine vorzeitige Optimierung, nur Planung, wie "Scheitern planen zu planen ist fehlgeschlagen ;-)" –

+1

Planung ist in Ordnung, aber ich würde die Anwendung schreiben (Caching im Hinterkopf behalten) und dann testen. Wenn es nicht schnell genug ist, fügen Sie Caching durch etwas wie Spring AOP hinzu - anstatt Caching-Logik in Ihren Anwendungscode einzubetten. Dies würde auch die Antwort auf die Frage erleichtern, da wir einen tatsächlichen Code [oder Anwendungsfall] sehen und vorschlagen könnten, wo Caching am nützlichsten wäre. – Gandalf

Antwort

0

ich einmal versucht, was ich denke, ist eine ähnliche Caching-Strategie und fand es unhandlich. Schließlich habe ich nur die Objekte zwischengespeichert, aus denen die Seiten bestehen, und die Seiten für jede Anfrage generiert. 10 Cachehits zum Aufbau einer Seite werden (hoffentlich) sekundenschnelle Reaktionszeit sein, ziemlich unmittelbar für die Nutzer Ihres Dienstes.

Wenn Sie müssen ganze Seiten zwischengespeichert werden (ich glaube, von ihnen als Ergebnis Sets) dann vielleicht könnten Sie die Benutzeranforderung durch einen Hash ausführen und verwenden, die als Cache-Schlüssel. Es ist ein schweres Problem, mit einem konkreten Beispiel oder Code zu visualisieren (zumindest für mich).