2010-08-06 10 views
14

Ich bin ziemlich neu zu Caching-Strategien und Implementierungen. Ich arbeite an einem Projekt, das datenbankintensiv sein wird, aber auch Informationen, die sehr regelmäßig aktualisiert und geändert werden.Caching-Strategie, wann wird Caching sinnlos?

Ich habe genug Informationen gefunden, um allgemein zu wissen, wie man die Caching-Funktion entwickelt, aber was ich unsicher bin, ist die allgemeine Strategie.

Wenn ich alle Abfrageergebnisse zwischenspeichern und sie nach logischen Dingen gruppiere, die ich bei sinnvollen Triggern löschen kann, dann habe ich wahrscheinlich Zehntausende (zumindest) kleine Dateien in meinem Cache. Wäre es sinnvoller, nur große Abfrageergebnisse zwischenzuspeichern?

Ich weiß, dass dies eine etwas hardware-spezifische Frage ist, aber allgemein gesprochen, bei welchem ​​Umfang von Dateien wird Caching etwas sinnlos? Das heißt, wenn Sie das Dateisystem mit all diesen kleinen Dateien laden, wird der Zugriff auf sie schließlich langsam genug, so dass Sie die Informationen nicht einfach zwischengespeichert haben könnten?

Dank all, ich habe Interesse an irgendwelchen Meinungen Sie

EDIT zu bieten haben: Auf der Grundlage der Antworten in Bezug auf diese absolut ist anwendungsspezifisch, lassen Sie mich die Frage auf diese Weise darstellen, die universell sein sollte:

Angenommen, ich habe eine Anwendung, die von einer Tabelle mit 1.000.000 Elementen abhängt ...

Wäre es schneller, eine Abfrage auszuführen, um eines dieser Elemente direkt aus der Datenbank abzurufen oder eines dieser Elemente abzurufen aus meinem Cache-Verzeichnis mit 1.000.000 Dateien, von denen jede die Details eines dieser Dateien enthält e Gegenstände?

EDIT: Anscheinend 100.000 war nicht genug, um eine gültige Antwort zu erhalten, machen wir es 1.000.000. Will jemand für 1.000.000.000 gehen? Weil ich es kann ...

+3

Da Sie nach den Meinungen von Personen fragen und keine Lösung besser ist als eine andere (zumindest nicht ohne Angabe Ihrer Anforderungen und des Anwendungsfalls), könnten Sie dies in ein Community-Wiki ändern. – mikegreenberg

+0

@Michael - Mein Anwendungsfall oder meine Anforderungen sind nicht so spezifisch. Ich frage nur, ob ich, wenn ich jedes kleine Stück Information in Dateien zwischenspeichern werde, irgendwann die reine Menge von Dateien den Leistungsgewinn von Caching in erster Linie verschlechtert? – Chris

+0

Mysql sollte und kann auf so winzigen Volumes wie 100k Zeilen extrem schnell arbeiten. Sie haben also genügend Leistungsreserven, um nicht zum Cache-Maniac zu werden. – zerkms

Antwort

2

Die allgemeine Regel ist: nicht zwischenspeichern, während es nicht notwendig ist und Cache nur die Dinge, die zwischengespeichert werden müssen.

+4

Ist das eine Cache-y-Art zu sagen, es zuerst zu arbeiten, und dann sorgen, wie schnell es ist? –

+0

Ok. Also werde ich es zu einer Option machen und es nur einschalten, wenn die Dinge langsamer werden. :) Aber, ist es möglich, so viele Dinge zu cachen, dass es entweder die Leistung nicht verbessert oder es sogar verschlechtert? – Chris

+4

** NIEMALS ** Cache, weil Ihre Anwendung langsam ist. Das ist ein Rezept für eine Katastrophe. Cache, weil Sie zu viel geladen haben (dh zu viele gleichzeitige Anfragen). Aber wenn Ihre Anwendung ohne Cache langsam ist, fügt das Hinzufügen nur ein Pflaster auf eine Schusswunde ... Wenn es langsam ist, beheben Sie die Langsamkeit ... – ircmaxell

10

Verwenden Sie den integrierten Abfragecache von MySQL, anstatt ihn selbst zu verwalten. Es löscht zwischengespeicherte Abfragen automatisch zu Tabellen, wenn sie in geschrieben werden. Plus, es funktioniert im Speicher, so sollte es sehr effizient sein ...

Auch nicht nur Abfragen zwischenspeichern. Versuchen Sie, ganze Segmente der Anwendung in verschiedenen Phasen des Rendering-Zyklus zwischenzuspeichern. Sie können also MySQL die Abfragen zwischenspeichern lassen und dann jede einzelne Ansicht (gerendert), jeden einzelnen Block und jede Seite zwischenspeichern. Anschließend können Sie auswählen, ob der Cache basierend auf der Anforderung abgerufen werden soll oder nicht.

Zum Beispiel kann ein nicht angemeldeter Benutzer die vollständige Seite direkt aus dem Cache abrufen. Ein eingeloggter Benutzer kann dies jedoch nicht (aufgrund eines Benutzernamens usw.). Für ihn ist es vielleicht möglich, 1/2 Ihrer Ansichten auf der Seite aus dem Cache zu rendern (da sie nicht vom Benutzerobjekt abhängen). Sie profitieren immer noch vom Caching, aber je nach Bedarf wird es abgestuft.

Wenn Sie wirklich viel Verkehr erwarten, ist es auf jeden Fall einen Blick wert in Memcached. Lassen Sie MySQL speichern Sie Ihre Anfragen für Sie, und speichern Sie dann alle Benutzer-Land Cacheelemente in memcache ...

Edit: Ihre bearbeiten beantworten:

Dateisysteme langsam werden kann, wenn ein einzelnes Verzeichnis groß wird.Solange Sie "Namespacing" nach Verzeichnis (so dass jedes Verzeichnis nur einen kleinen Teil der Cache-Dateien hat), sollten Sie von diesem Standpunkt aus in Ordnung sein. Was die genaue Schwelle betrifft, wird es mehr als alles andere von Ihrer Hardware und Ihrem Dateisystem abhängen. Ich weiß, EXT3 wird ziemlich langsam, wenn eine Menge Dateien in einem einzigen Verzeichnis (ich habe Verzeichnisse mit buchstäblich Hunderttausenden von Dateien, und es kann bis zu einer halben Sekunde zu einer der Dateien, geschweige denn tun) Art der Verzeichnis-Auflistung) ...

Aber erkennen Sie, dass, wenn Sie einen anderen Server hinzufügen, Sie entweder Duplizierung des Caches haben werden (was keine gute Sache ist), oder müssen Sie Ihren gesamten Cache neu schreiben Schicht. Gibt es einen Grund, nicht von Anfang an mit Memcached zu gehen?

EDit 2: um Ihre zuletzt bearbeiten zu beantworten:

Es ist immer noch zu hart zu rufen. Ich habe eine Anwendung mit einer Datenbank mit ungefähr 1,5 Milliarden Zeilen (wächst um 500k pro Tag). Wir verwenden überhaupt kein Caching, da wir keine Nebenläufigkeitsprobleme haben. Und selbst wenn wir das täten, wäre es besser, mehr MySQL-Server darauf zu werfen, als Caching hinzuzufügen, da jede Art von Cache eine so geringe Trefferquote hat, dass es nicht die Entwicklungszeit wert wäre, sie hinzuzufügen.

Und das ist der Grund, warum ich so hartnäckig bin, nicht für Geschwindigkeit zu cachen. Es wird immer ein Objekt geben, das nicht im Cache ist. Wenn Sie also eine Seite mit einem dieser Objekte ankreuzen, muss es immer noch schnell sein. Als Faustregel versuche ich, alles zwischenzuspeichern, auf das in den nächsten Minuten noch einmal zugegriffen wird (ich habe sowieso eine Laufzeit von etwa 5 Minuten in der Produktion für andere Anwendungen). Wenn also Artikel in dieser Zeitspanne nicht mehr als ein paar Treffer erhalten oder die Trefferquote sehr niedrig ist (weniger als 90%), speichere ich diesen Artikel nicht ....

+0

Danke. Genau darum war ich neugierig. – Chris

0

Dies ist beides Hardware- und anwendungsabhängig. Sie müssen Benchmarks durchführen, um den Schwellenwert zu bestimmen, ab dem die Indizierung des Betriebssystems größer als die Dauer der Datenspeicherung/-wiederherstellung ist (sowohl auf der MySQL-Ebene als auch im Cache-Dateizugriffsbereich). Und Sie müssen dies auch mit der akzeptablen (sehr subjektiven) Schwelle Ihrer Zielgruppe vergleichen.