2012-11-01 17 views
8

Ich denke Redis für Web-Anwendung-Protokollierung verwenden. Ich habe gegoogelt, dass es Leute gibt, die diesen Ansatz verwenden, indem sie die Logs in eine Redis-Queue/-Liste legen und dann einen geplanten Worker zum Schreiben auf die Festplatte schreiben.Redis für Protokollierung

http://nosql.mypopescu.com/post/8652869828/another-redis-use-case-centralized-logging

Ich wünsche Verständnis suchen, warum nicht direkt Redis verwenden, um Datenträger zu bestehen? Wenn ich einen kleinen Server zugewiesen habe, auf den Redis schreiben wird, getrennt von der Datenbank, dem App-Server, ist es möglich, Redis zu verwenden, um die Protokolle direkt persistent zu machen?

Ich brauche auch Hilfe bei der Abfrage von Redis nach Datetime, Benutzer, etc. Zum Beispiel ist jedes Protokoll wie folgt.

datetime=>2012-03-24 17:45:12 
userid=>123 
message=>test message 
category=>my category 

Wie kann ich nach Ergebnissen innerhalb eines Datetime-Bereichs für einen bestimmten Benutzer einer bestimmten Kategorie suchen?

Danke!

Antwort

19

Sie müssen berücksichtigen, dass Redis eine In-Memory-Datenbank ist (auch wenn sie die Daten auf der Festplatte beibehalten kann). Die Daten, die Sie in Redis eingeben, müssen in den Speicher passen.

Der Vorschlag in dem von Ihnen erwähnten Artikel bezieht sich auf die Verwendung von Redis als verteiltes Warteschlangensystem. Worker-Prozesse nehmen die Einträge aus der Warteschlange und schreiben sie auf die Festplatte. Es gibt also nicht so viele Elemente in Redis-Speicher. Dieser Entwurf hat einen Fehler: Wenn die Worker-Prozesse die Daten nicht schnell genug auf die Platte schreiben können, explodiert der Redis-Speicherverbrauch - er muss also durch die Konfiguration (Parameter Redis maxmemory) oder die Software begrenzt werden (die Warteschlange wird zur Einfügezeit beschnitten oder leer) die Warteschlange, wenn es voll ist).

Jetzt funktioniert Ihr Vorschlag nicht wirklich, da alle Daten, die Sie in Redis schreiben, im Speicher gehalten werden (auch wenn sie von Redis selbst auf der Festplatte gespeichert werden).

Ein weiterer Punkt ist, dass Sie Redis nicht abfragen können. Redis ist keine relationale Datenbank, es unterstützt keinen Ad-hoc-Abfragemechanismus, nur Befehle, die zuvor definierte Zugriffspfade enthalten. Wenn Sie Daten mit verschiedenen Parametern suchen wollen, müssen Sie alle möglichen Suchen antizipieren und die relevanten Datenstrukturen (Menge, sortierte Mengen, usw.) zum Zeitpunkt des Einfügens erstellen.

Ein anderer Speicher (MongoDB oder eine relationale Datenbank) wird wahrscheinlich viel besser für Ihren Anwendungsfall passen.

+0

Ich sehe nur eine Redis Demo. Peter Cooper sagte, dass Redis für das Logging entworfen/implementiert wurde (er ist nahe genug an der Quelle, um autorisierend zu sein). Während Ihre Kommentare wahr sind, müssen Sie daher etwas mehr lesen. – Richard

+3

Redis wurde entworfen, um lloogg zu unterstützen (http://lloogg.com/). Aber der lloogg-Dienst besteht nicht darin, alles im Speicher zu behalten und dann Abfragen zu verarbeiten. Es geht darum, Daten innerhalb der richtigen Datenstrukturen spontan zu speichern und zu aggregieren, um einen einfachen Zugriff auf die Daten zu ermöglichen. Das ist nicht dasselbe. –

1

Redis befindet sich im Speicher des Datenspeichers. Die direkte Persistenz von Daten auf Festplatte ist mit dem Befehl Save oder BGSAVE möglich. Persistenz (RDB/AOF) ist eine Funktion zusätzlich zu speicherinternem Speicher.

Anforderung erwähnt, Protokolle auf der Festplatte zu speichern. Die Verwendung von Message Queues (wie RabbitMQ) anstelle von In-Memory-Datenspeichern sollte die Dinge vereinfachen. (Protokolle werden keinen Speicher verbrauchen)

Anwendungen, die Protokolle generieren, können sie in Warteschlangen veröffentlichen, wobei separate Benutzer Protokollnachrichten verwenden und sie auf die Festplatte schreiben.

Wie kann ich nach Ergebnissen innerhalb eines Datumsbereichs eines bestimmten Benutzers einer bestimmten Kategorie suchen?

als Wert
struct log{ 
    long datatime; 
    string userId; 
    string message; 
    string category; 
    }; 

Serialize diese Struktur zu bespannen und speichern sie in Redis:

Jeder Block von log sollte als Struktur (Beispiel für C/C++) so etwas wie diese gespeichert werden. Keys für solche Werte wäre wie: key = userId + DELIMITER + Kategorie + DELIMITER + Datatime

Sie Funktion, die alle Schlüssel bekommt haben wieder und teilen sie die Liste der Daten für Ihre spezifischen Keyword zu bekommen.

+0

Ist es möglich, Bereichsabfragen (nach datetime) mit diesem Ansatz auszuführen? – Legend

7

können Sie speichern Protokolle mit folgenden Struktur:

"logs:{category}:{userid}:{datetime}" = message 

Und dann fordern Sie es wie folgt:

"logs:*:{userid}:{datetime}" 

Oder

"logs:{category}:*:{datetime}" 
Verwandte Themen