2009-08-20 19 views
13

Ich baue einen Web-Shop mit vielen Abteilungen und Kategorien. Sie werden in unserer Datenbank gespeichert und oft abgerufen.Asp.net - Caching vs statische Variable zum Speichern eines Wörterbuchs

Wir verwenden URL-Rewriting, so dass fast jede Anfrage innerhalb des Geschäfts eine Suche generiert. Wir müssen auch häufig über die Daten iterieren, um Menüs für den Hauptspeicher und die Abteilungsseiten zu erzeugen.

Diese Informationen werden sich nicht oft ändern, daher denke ich, dass ich die Datenbank in ein Wörterbuch laden sollte, um den Informationsabruf zu beschleunigen.

Ich weiß, dass die Standardmethode darin besteht, Daten in den Anwendungscache zu laden, aber ich nehme an, dass beim Caching Serialisierungsebenen vorhanden sind, und für eine große Datenstruktur würde der Overhead erheblich sein.

Mein Impuls dabei ist, das Wörterbuch in eine statische Variable in einer der verwandten Klassen zu setzen. Ich möchte jedoch etwas Input dazu bekommen. Habe ich Recht, dass diese Methode schneller wäre? Ist es eine schreckliche Übung? Gibt es einen besseren Weg, den ich vermisse?

Ich kann nicht scheinen, viele Informationen darüber zu finden, und ich würde wirklich jede Information schätzen, die Sie teilen können. Vielen Dank!

Antwort

19

Die Anwendungs- und Cache-Sammlungen serialisieren die Objekte nicht, die Sie an sie übergeben, sie speichern die eigentliche Referenz. Das Abrufen eines Objekts aus dem Cache ist keine kostspielige Operation, unabhängig davon, wie groß das Objekt ist. Bleiben Sie immer bei den Cache-Objekten, es sei denn, Sie haben einen sehr guten Grund, dies nicht zu tun, es ist nur eine gute Übung.

Die einzige andere erwähnenswerte Sache ist, dass Sie über Multithread-Zugriff auf diese Sammlung nachdenken. Sie werden sehr schnell mit einigen ernsten Problemen enden, wenn Sie nicht richtig sperren

+0

Vielen Dank - Genau das musste ich wissen. –

+0

froh zu helfen :) – LorenVS

+4

Stellen Sie nur sicher, dass, wenn Sie die Anwendung oder den Cache verwenden, sie pro Computer sind. Wenn Sie mehrere Maschinen (zB Webfarm) haben, dann sind Sie in Schwierigkeiten .. und Sie müssen eine skalierbare Caching-Lösung, wie Microsoft Velocity oder MemCacheD verwenden (das 'D' ist für Daemon). –

3

memcached ist dein Freund! (aber könnte Overkill sein, wenn Sie nicht skalieren)

Irgendeine Idee, wie groß Ihr Wörterbuch im Anwendungscache wäre? Ich wäre versucht, das als eine gute erste Option zu empfehlen.

+0

Ich sehe ein paar Dutzend Abteilungen und ein paar hundert Kategorien zusammen mit zugehörigen Informationen ... so Größe sollte es nicht so schlimm sein. Ich zögere nur, Caching auf Datenbankebene zu verwenden, da bei jedem Aufruf die Objekte, die von der Datenbank zurückgegeben werden, immer noch in die zugeordneten Typen konvertiert werden müssen. Es gibt auch einige damit verbundene Daten wie die URL, die ich vorberechnen wollte. Angesichts der Tatsache, dass ich häufig lange Listen dieser Artikel bekommen muss, dachte ich, ich sollte weiter oben in der Zeile cachen. Es ist immer noch eine gute Option und ich schätze die Informationen sehr! –

4

Nun, ich denke nicht, dass es so viel Arbeit ist, Code neu zu schreiben, um ein statisches Feld anstelle von Anwendungscache zu verwenden, wenn es nötig ist um es zu tun. Ich würde persönlich zuerst den Cache benutzen. Sie brauchen keine vorzeitige Optimierung, haben Sie die Leistung gemessen? Es verhält sich möglicherweise genau richtig mit dem Anwendungscache-Objekt. Vielleicht klappt das sogar mit db-Abfragen? :)

Also, meine Antwort ist - verwenden Sie den Cache und sehen, wie es funktioniert.

Verwandte Themen