2010-01-10 11 views

Antwort

10

ich glaube, ich mit Redis gehen würde, denn:

  • Antirediz (sein Spitzname) wirklich aktiv Redis entwickeln wird. (Jedes Mal, wenn ich mein GitHub-Dashboard anschaue, hat er einen neuen Code erstellt). Er entwickelt jetzt redis fulltime dank VMware
  • Redis ist schließlich hartnäckig, so dass die Leistung kickass ist (zuerst verwendet nur Speicher, der schnell ist).
  • Redis hat eine atomare increment Operation, die Sie benötigen.
  • Redis hat eine Menge gute PHP-Bibliotheken. Es gibt auch eine, die als C extension geschrieben wird, also hat es wirklich gute Leistung. Redis website hat auch einen Überblick über diese Erweiterungen. Einige sind reiner PHP-Code (etwas langsamer, aber einfacher zu konfigurieren).
+0

Hände runter würde ich sagen Redis. Ich mache ein Gegenstück und dränge 30k Befehle pro Minute auf einem $ 20 512MB VPS. :) –

+0

Wir haben versucht, Redis für ein Zähler-System zu verwenden. Redis 'primärer Datenspeicher ist RAM, und unser Dataset war einfach zu groß, um effektiv zu sein.Etwas mehr wie Tokyo Tyrant - die nicht immer den gesamten Datensatz in Ram speichern muss - wäre wahrscheinlich eine bessere Wahl gewesen. –

+0

Ein einfacher Zähler kann nicht im RAM gehalten werden? Twitter speichert fast alle aktiven Tweets im Speicher. Wenn Sie Leistung wollen, sollten Sie ein wenig Geld für ein Speichermodul bezahlen. Nebenbei könnt ihr ein paar Gigs von Ram günstig bekommen. – Alfred

1

Die berühmten View-Counter der 1990er Jahre verwendeten einfache Dateien, um die Nummer zu speichern. Wenn Sie nur eine Nummer speichern müssen, ist alles gut genug.

+2

Wenn Sie irgendeine Art von bedeutungsvollem Verkehr erhalten, hat das Schreiben in eine Datei auf der Festplatte Probleme mit der Gleichzeitigkeit. Es sei denn, Sie verwenden die Dateisperrung, aber Sie laufen Gefahr, dass es zu Sperrkonflikten kommt. Projekte wie Memcached existieren aus einem Grund. –

+2

Aber wenn Sie es nur für eine einfache (wenig Verkehr) Website verwenden, könnte dies funktionieren und wird einfach zu implementieren sein – Alfred

+0

Lock Contention ist nicht so schwer. 'while (! get_lock() || count> 10000) {Schlaf (0,001); Zählung ++}; fread() oder fwrite(); remove_lock(); 'So einfach kann man Hunderttausende von Anfragen pro Sekunde verarbeiten ... vorausgesetzt, das gewählte Betriebssystem ist schnell im Dateisystembetrieb. –

-1

Ich würde sagen, APC oder Memcached sind eine gute Wahl.

+1

Ohne Persistenz? – stesch

+0

+1. Redis ist auch vergleichbar und hat Ausdauer eingebaut. –

9

MongoDB mit Upserts ist großartig dafür.

Wenn Sie speichern so etwas wie:

{ "url" : "www.example.com", "pageviews" : 0 } 

können Sie atomar Schritt mit Seitenaufrufe der atomaren Operation $ inc wirklich schnell:

db.downloads.update({'url' : 'www.example.com'}, {'$inc' : {pageviews : 1}}) 

Wenn Sie upserts verwenden, müssen Sie sich nicht um zu prüfen, ob ein Dokument existiert, bevor es aktualisiert wird. Zum Beispiel, wenn Sie sagen:

db.downloads.update({'url' : 'www.example.com'}, {'$inc' : {pageviews : 1}}, {"upsert" : true}) 

das Dokument mit der URL erstellt werden www.example.com, wenn sie noch nicht existiert (mit Seitenzugriffen auf 1 gesetzt) ​​oder, wenn es nicht vorhanden ist, wird seinen Seitenzugriffe inkrementiert. Das bedeutet, dass Sie sich nicht darum kümmern müssen, die Sammlung vorab zu füllen.