redis für die Protokollierung

8

Ich denke daran, Redis für die Protokollierung von Webanwendungen zu verwenden. Ich habe gegoogelt, dass es Leute gibt, die diesen Ansatz verwenden, indem sie die Logs in eine Redis-Warteschlange / -Liste und dann einen geplanten Worker zum Schreiben auf die Festplatte ablegen.

Ссылка

Ich möchte Verständnis dafür finden, warum Redis nicht direkt auf der Festplatte verbleibt? Wenn ich einen kleinen Server zugewiesen habe, auf den Redis schreiben wird, getrennt von der Datenbank, 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, user usw. Zum Beispiel ist jedes Protokoll wie folgt.

%Vor%

Wie kann ich nach Ergebnissen innerhalb eines Datumsbereichs eines bestimmten Benutzers für eine bestimmte Kategorie suchen?

Danke!

    
twb 01.11.2012, 01:37
quelle

3 Antworten

19

Sie müssen daran denken, dass Redis eine In-Memory-Datenbank ist (auch wenn sie die Daten auf dem Datenträger 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 durch die Software begrenzt werden die Warteschlange, wenn es voll ist).

Nun funktioniert Ihr Vorschlag nicht wirklich, da alle Daten, die Sie in Redis schreiben, im Speicher bleiben (selbst 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 möchten, 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 zu Ihrem Anwendungsfall passen.

    
Didier Spezia 01.11.2012, 08:07
quelle
7

Sie können Protokolle mit folgender Struktur speichern:

%Vor%

Und fordern Sie es dann wie folgt an:

%Vor%

Oder

%Vor%     
mrded 24.03.2015 15:53
quelle
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 zum Speicher im Speicher.

Anforderung ist, Protokolle auf der Festplatte zu speichern. Die Verwendung von Message Queues (wie RabbitMQ) anstelle von In-Memory-Datenspeichern sollte die Dinge vereinfachen. (Logs werden keine Speicher auffressen)

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

  

Wie kann ich nach Ergebnissen innerhalb eines Datumsbereichs eines bestimmten Benutzers für eine bestimmte Kategorie suchen?

Jeder Block des Protokolls sollte als eine Struktur (Beispiel für C / C ++) in etwa wie folgt gespeichert werden:

%Vor%

Serialisieren Sie diese Struktur, um sie zu string und speichern Sie sie in Redis als Wert.   Schlüssel für solche Werte wären:   key = userId + DELIMITER + Kategorie + DELIMITER + Datenzeit

Sie können Funktionen haben, die alle Schlüssel zurückbekommen und sie teilen, um eine Liste von Daten für Ihr spezifisches Schlüsselwort zu erhalten.

    
Nik 20.11.2013 05:00
quelle

Tags und Links