2012-11-01 10 views
8

Sto pensando di utilizzare Redis per scopi di registrazione delle applicazioni web. Ho cercato su google che ci sia gente che usa questo approccio scaricando i log in una coda/lista Redis e poi un lavoratore programmato da scrivere sul disco.redis per la registrazione

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

desidero cercare di capire che perché non utilizzare direttamente Redis a persistere su disco? Se ho assegnato un piccolo server su cui Redis scriverà, separato dal database, app server, è possibile utilizzare Redis per mantenere i log direttamente?

Ho anche bisogno di aiuto per interrogare Redis tramite datetime, utente, ecc. Ad esempio, ogni registro è come segue.

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

Come posso richiedere risultati in un intervallo datetime, da un utente specifico, di una particolare categoria?

Grazie!

risposta

19

È necessario tenere presente che Redis è un database in memoria (anche se può persistere i dati su disco). I dati che hai inserito in Redis devono essere contenuti nella memoria.

La proposta nell'articolo che menzionate riguarda l'utilizzo di Redis come sistema di accodamento distribuito. I processi di lavoro disconnettono gli elementi e li scrivono su disco, quindi non ci sono molti elementi nella memoria di Redis. Questo design ha un difetto: se i processi di lavoro non possono scrivere i dati abbastanza velocemente sul disco, il consumo di memoria di Redis esploderà, quindi deve essere limitato dalla configurazione (parametro Redis maxmemory) o software (tagliare la coda al momento dell'inserimento o vuoto la coda quando è piena).

Ora la tua proposta non funziona perché tutti i dati che scrivi in ​​Redis saranno conservati in memoria (anche se sono stati salvati su disco da Redis stessa).

Un altro punto è che non è possibile interrogare Redis. Redis non è un database relazionale, non supporta meccanismi di query ad-hoc, solo comandi che coinvolgono percorsi di accesso definiti in precedenza. Se vuoi cercare dati con parametri diversi, devi anticipare tutte le ricerche possibili e costruire le strutture dati rilevanti (set, serie ordinate, ecc ...) al momento dell'insediamento.

Un altro negozio (MongoDB o un database relazionale) sarà probabilmente molto più adatto per il tuo caso d'uso.

+0

Ho appena visto una demo Redis. Peter Cooper ha detto che Redis è stato progettato/implementato per la registrazione (è abbastanza vicino alla fonte per essere autorevole). Pertanto, mentre i tuoi commenti sono veri, è necessaria una lettura aggiuntiva. – Richard

+3

Redis è stato progettato per supportare lloogg (http://lloogg.com/). Ma il servizio lloogg non si occupa di tenere tutto in memoria e quindi elaborare le query. Si tratta di archiviare/aggregare i dati al volo all'interno delle giuste strutture dati consentendo un facile accesso ai dati. Questa non è la stessa cosa –

1

Redis è in archivio dati di memoria. La persistenza diretta dei dati su disco è possibile con il comando Salva o BGSAVE. Persistenza (RDB/AOF) è una funzionalità in aggiunta allo spazio di archiviazione in memoria.

Il requisito menzionato è quello di memorizzare i registri su disco. L'uso di una qualsiasi coda di messaggi (come RabbitMQ) invece di un datastore in memoria dovrebbe semplificare le cose. (i registri non consumano memoria)

Le applicazioni che generano registri possono pubblicarli su code e con consumatori separati che consumano messaggi di registro e li scrivono su disco.

Come posso richiedere risultati all'interno di un intervallo datetime, da un utente specifico, di una particolare categoria?

Ogni blocco di registro deve essere salvato come una struttura (ad esempio per C/C++) qualcosa di simile:

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

Serialize questa struttura a stringa e conservarla in Redis come valore. Tasti per tali valori sarebbero come: key = userId + DELIMITER + categoria + DELIMITER + DataTime

Si può avere la funzione che ottiene tutte le chiavi e dividerli per ottenere l'elenco dei dati per la parola chiave specifica.

+0

È possibile emettere query di intervallo (su datetime) utilizzando questo approccio? – Legend

7

È possibile memorizzare i registri con seguente struttura:

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

e quindi richiedere come segue:

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

O

"logs:{category}:*:{datetime}" 
Problemi correlati