2009-07-29 10 views
22

Ich habe ein soziales NetzwerkSitzung VS Datei VS Memcache für einen Cache in PHP?

  • Die Tabelle Benutzer ist rund 60.000 Zeilen

  • Die Freunde Tisch rund 1 Million Reihen (die zu bestimmen ist Ihr
    Freund) ist

Ich möchte einen Freund Feed, Wand, was auch immer Sie es gerne nennen, es wird Dinge wie Benutzerstatus Post (twitter Art Beiträge) zeigen, wird es zeigen ein paar verschiedene Dinge, aber für den Anfang wird es nur Freund Status und vielleicht Blog-Post.

Im Allgemeinen werden nur Inhalte angezeigt, die mit einer Benutzer-ID in Ihrer Freundesliste veröffentlicht wurden.

Ich habe versucht, den besten Weg zu kommen und bin nicht sehr weit gekommen, aber hier ist meine neueste Idee.

Aktuell Futter zu bauen, muß ich

  1. auf der großen Freund Tabelle die Liste des Freund ID 's Get

  2. die Stream-Daten aus dem Freund IDs aus dem obigen Ergebnis holen

  3. JOIN der Benutzer Tabelle, um die Publisher Bild URL und Benutzername

  4. zu erhalten
  5. JOIN dann die Kommentare Tabelle Kommentare zu den Feed-Einträge geschrieben zu bekommen

Das eine große Aufgabe ist

Ich habe 3 Ideen, die Futter so weit zu bauen, das ist, wo Ihre Hilfe kommen in kann

Memcache Option:.

  1. Verwenden memcache und einen Benutzer Freundesliste als Array-Cache, wenn der Benutzer Protokolle in die Website, auch wenn der Benutzer eine neuen Freund Anfrage für einen Freund dort Liste hinzugefügt werden genehmigt, es würde es Cache wieder aufzubauen.
  2. Zusätzlich zu nur dort Freunde zu bekommen konnte ich dort Freunde Bild URL und Benutzername speichern, würde dies Dinge wieder durch die Beseitigung dieser Abfrage beim Aufbau der Freund-Feed zu beschleunigen.

Datei-Cache-Option:

  1. Sie die gleiche wie die memcache Option aber diese Daten als Array auf eine Cache-Datei anstelle des Speichers nicht speichern, dann diese Cache-Datei enthalten in die Seite.

  2. Ich bin nicht sicher, was ist die beste Methode für die Leistung I memcache speichert alles im Speicher so Freunde zu verstehen, die wie 20.000 Freunde haben, die viel Speicher und einen Dateicache würde nur verwenden könnte put es im Speicher, wenn die Benutzer es braucht, wenn ich richtig bin. wenn ich auch die Datei Methode tat, wenn ein Benutzer abmeldet der Website, würde ich dort Cache-Datei, so dass die Cache-Ordner löschen würde niemals Dateien zu groß sein

Session Cache Option:

  1. Gleiche wie Dateicache oben, ich habe erkannt, dass die Sitzungsdaten in einer Datei gespeichert wird, so würde nicht, dass es zu sein, ein Cache-fähig machen?

Bitte geben Sie mir Ihre Meinung oder irgendwelche Ratschläge oder Informationen, die Sie auf diese haben, wie ich, nicht viel Wissen über Caching habe ich habe viel gelesen, aber manchmal andere Völker Ideen helfen, eine Menge

+0

„Sitzungsdaten in einer Datei gespeichert wird“. Ihre obige Aussage ist falsch. Die Sitzung kann so konfiguriert werden, dass sie in der Datenbank gespeichert wird. Der Standard-Session-Handler ist eine Datei. – sudip

Antwort

28

Memcache ist die beste Wahl für eine Vielzahl von Gründen:

  1. es ist wirklich schnell - Alles ist in Erinnerung, und es ist sehr für Situationen optimiert wie Ihre (und Caching im allgemeinen :)
  2. es verteilt ist - Dies bedeutet, tha t Wenn Sie mehrere Web-/App-Server ausführen, können alle auf denselben Cache zugreifen
  3. Sie können mehrere Server für Memcache zusammenfassen - Wenn Sie einige relativ wenig ausgelastete Server (oder mehrere dedizierte Cache-Server) haben können sie alle zusammen in einem großen Cache-Pool
  4. Es ist super-skalierbare (aus den Gründen, vor erwähnt)
  5. Es große PHP-Unterstützung bekam ist - das PECL-Paket für memcache vor kurzem mit einer Menge neuer Güte
  6. wurde aktualisiert
  7. Sie Speichern Sie Ihre Benutzersitzungen sogar in Memcache - richten Sie sie einfach in Ihrer php.ini-Datei ein. Dies ist viel schneller als das Speichern von Sitzungen in Datenbanken und ermöglicht es, dass Ihre Sitzungen über mehrere Webhosts persistent bleiben (wenn Sie sich in einer Last-ausgeglichenen Situation befinden) ... dies gibt Ihrer Site auch einen Leistungsschub, da dies nicht nötig ist um das Dateisystem/die Datenbank für Sitzungsinformationen bei jeder Anfrage zu treffen.

... und viele mehr;)

In Bezug auf einige Ihrer Bedenken hinsichtlich Speicherbedarf der einzelnen Cache gespeicherten Elemente, die Sie ein paar Optionen haben.Mein anfänglicher Gedanke ist, es einfach zu drehen, zu sehen, wie groß diese Cache-Elemente wirklich werden (Sie können mehrere Open-Source-Dinge finden, um die tatsächliche Cache-Nutzung zu überwachen, wie z. B. Kakteen). Ich denke, sie werden kleiner sein, als du denkst.

Wenn nicht, würde ich vorschlagen, Ihre Cache-Strategie so weit zu überdenken, was Sie tatsächlich cachen, für wie lange usw. Vielleicht könnten Sie den Feed aus mehreren Dingen bereits im Cache (dh Cache individuelle Benutzerdaten und erstellen Sie dann den Feed für eine Person aus all diesen einzelnen Elementen im Cache). Es gibt viele gute Artikel da draußen auf der Vorderseite, einfach suchen sie heraus :)

+0

Vielen Dank für den Beitrag sehr informativ, auch wenn Sie Kakteen zur Messung Ram verwenden, meinst du es im Allgemeinen messen oder messen Sie es mit Memcache? Danke – JasonDavis

+1

Es gibt tatsächlich ein Kakteenplugin für die Überwachung von Memcache selbst ... gibt Ihnen Treffer/Fehlschüsse, num Artikel, usw. –

+0

Danke Ich kann es kaum erwarten Memcache auszuprobieren, auch ich habe gerade herausgefunden, dass Facebook die Leute auf 5.000 Freunde beschränkt Ich denke, ich werde das auch tun, und das wird mehr als alles andere helfen! – JasonDavis

1

Die standardmäßige maximale Objektgröße, die in Memcache zulässig ist, ist 1 MB.

@jsaondavis: "Sitzungsdaten werden in einer Datei gespeichert".

Ihre obige Aussage ist falsch. Die Sitzung kann so konfiguriert werden, dass sie in der Datenbank gespeichert wird. Standard-Session hadndler ist eine Datei.

1

Redis wäre eine gute Lösung sein:

Hier ist ein Thread auf dem Redis Vs. Memcached. Klingt wie Redis 512 MB Speicher statt der 1MB Grenze hat ... schon etwas anders aus :)

Memcached vs. Redis?