2017-06-22 2 views
0

Meine Ansicht zeigt eine Tabelle mit Daten an (spezifisch für einen Kunden, der viele Benutzer haben kann) und diese Tabelle benötigt eine Menge an Rechenressourcen, um sie zu füllen. Die Daten eines Kunden ändern sich 4/5-mal pro Woche, normalerweise am selben Tag.Python Django Cache vs im Modellfeld speichern? Was ist effizienter?

Caching ist eine naheliegende Lösung, aber ich frage mich, ob Django's cache framework wesentlich effizienter ist, als ein Textfeld auf der Kundenebene zu erstellen und stattdessen die Daten dort zu speichern?

Ich denke, es ist einfacher zu implementieren (und löschen Sie das Textfeld, wenn sich die Daten ändern), aber was sind die Nachteile und gibt es noch etwas, auf das ich achten muss? (Probleme, wenn der Datensatz zu groß wird? zusätzliche Felder im Modell etc etc)

Jede Hilfe wäre sehr willkommen!

Antwort

0

Das Cacheframework hat den Vorteil, dass Sie die Datenbank nicht verwenden müssen. Sie können Ihren Cache-Speicher unabhängig von Ihrer Datenbank skalieren und den Cache auf verschiedenen physischen (oder virtuellen) Computern ausführen.

Darüber hinaus müssen Sie nicht die veraltete vs frische Logik implementieren, aber das ist eine einmalige.

2

Ein Cache ist ein Cache ist Cache, jedoch implementieren Sie es, und das Hauptproblem mit Caches ist die Ungültigkeitserklärung.

Wie Melvyn zu Recht geantwortet hat, ist der Fall für das Cache-Framework, dass es (naja, kann, je nachdem, welches Backend Sie wählen) außerhalb Ihrer Datenbank liegt. Ob es ein Pro oder Kontra ist, hängt wirklich von Ihrer Datenbanklast, Infrastruktur und whatnots ab ... wenn Sie bereits das Cachegramework verwenden (für mehr als nur bedingungsloses ganzseitiges Caching meine ich) und die Belastung Ihrer Datenbank minimieren wollen, dann ist es das möglicherweise die zusätzliche Komplexität wert.

Sonst speichern Sie Ihr berechnetes Ergebnis in der db ist ziemlich einfach und erfordert keine zusätzlichen Server, installieren usw. Ich würde persönlich für ein dediziertes Modell gehen - um unnötigen Overhead auf der Ebene db zu vermeiden -, einschließlich der zwischengespeicherten Ergebnis und eine Prüfsumme der Parameter, von denen dieses Ergebnis abhängt (kanonisches Memo-Muster), so dass Sie leicht erkennen können, ob es neu berechnet werden muss. Ich fand diese Lösung einfacher zu warten, als zu versuchen, Änderungen an jedem einzelnen dieser Parameter zu erkennen und den Cache "on the fly" (was eine ordnungsgemäße Cache-Invalidierung schwierig oder zumindest komplex zu implementieren ist) ungültig/erneut zu berechnen Dies hängt wiederum davon ab, was diese Parameter sind und woher sie kommen.

+0

Gute Antwort und der wahre Test ist zu sehen, wie lange die Berechnung dauert, wenn das System bereits unter Stress steht. Wenn dieses Zeitlimit überschritten wird, müssen Sie in Betracht ziehen, veraltete Daten zu verarbeiten, bis sie fertig sind, und das ist mit dem Cache-Feld etwas schwieriger zu tun. Eckfall für eine vernünftige Infrastruktur. – Melvyn

+0

Hallo bruno, vielen Dank. Es ist der Ansatz, den ich gerne machen würde, also ist es gut zu hören. Sie schlagen vor, ein neues Modell für diese Daten zu erstellen. Wäre es eine schlechte Idee, das Textfeld direkt in die Kundentabelle einzufügen? Ich habe gelesen [hier] (https://stackoverflow.com/questions/5268523/when-you-have-a-text-field-in-mysql-or-postgresql-should-you-put-it-in-a- -separa) dass Postgre (was ich bin) es ist immer noch effizient in diesem Szenario, aber ich frage mich, ob es noch etwas zu beachten? –

+0

Was mich betrifft, würde ich es immer noch von der Kundentabelle fernhalten, nur weil es semantisch nicht verwandt ist - ein Implementierungsdetail, das db als bitbucket für Wegwerfdaten verwendet - wo Ihre Kundentabelle wichtige Geschäftsdaten enthält. Nicht nur das, aber ich würde eine Fassade API davor verstecken die Tatsache, dass es in Ihrer Datenbank gespeichert ist, also zu einem Cache-Backend oder verschieben diese Tabelle auf eine andere Datenbank verschieben würde sehr lokalisierte Implementierung ändern bleiben. –

0

4-5 mal pro Woche sieht nicht wie eine große Herausforderung aus, aber niemand weiß außer Ihnen, welche Art von Berechnung Sie haben, wie viele Daten Sie speichern sollten, wie viele Benutzer Sie haben und so weiter. Wenn Sie dies mit TextField implementieren möchten, ist es immer noch eine Art Caching-System, also schlage ich vor, djangos Caching-System mit Datenbank-Backend zuerst https://docs.djangoproject.com/en/1.11/topics/cache/#database-caching zu verwenden. Sie können Daten mit 1 Abfrage wie im Fall von TextField nicht abrufen, aber später können Sie Ersetzen Sie die Datenbank bei Bedarf durch eine andere Ebene.

Verwandte Themen