Redis mantiene i dati?


122

Capisco che Redis serve tutti i dati dalla memoria, ma persiste anche durante il riavvio del server in modo che quando il server si riavvia legga in memoria tutti i dati dal disco. O è sempre un archivio vuoto che serve solo per archiviare i dati mentre le app sono in esecuzione senza persistenza?


1
Non sono sicuro di aver capito correttamente la tua domanda. Puoi salvare l'istantanea su disco e leggere da quel file, se non lo fai il tuo database redis sarà vuoto al riavvio.
Sefa

Risposte:


82

Ti suggerisco di leggere su questo su http://redis.io/topics/persistence . Fondamentalmente si perde la persistenza garantita quando si aumentano le prestazioni utilizzando solo l'archiviazione in memoria. Immagina uno scenario in cui inserisci in memoria, ma prima che venga persistito sul disco perdi energia. Ci sarà una perdita di dati.

Redis supporta i cosiddetti "snapshot". Ciò significa che eseguirà una copia completa di ciò che è in memoria in alcuni momenti (ad esempio, ogni ora intera). Quando si perde l'alimentazione tra due istantanee, si perderanno i dati dal tempo tra l'ultima istantanea e il crash (non deve essere un'interruzione di corrente ..). Redis scambia la sicurezza dei dati con le prestazioni, come fanno la maggior parte dei database NoSQL.

La maggior parte dei database NoSQL segue un concetto di replica tra più nodi per ridurre al minimo questo rischio. Redis è considerato più una cache veloce invece che un database che garantisce la coerenza dei dati. Pertanto i suoi casi d'uso in genere differiscono da quelli dei database reali: è possibile, ad esempio, memorizzare sessioni, contatori delle prestazioni o qualsiasi altra cosa in esso contenuta con prestazioni ineguagliate e nessuna perdita reale in caso di arresto anomalo. Ma l'elaborazione degli ordini / cronologia degli acquisti e così via è considerato un lavoro per i database tradizionali.


1
Sarà fantastico se puoi aggiungere il comportamento di persistenza predefinito. Come la risposta di @Leonid Beschastny.
yeya

40

Il server Redis salva di tanto in tanto tutti i suoi dati su HDD, fornendo così un certo livello di persistenza.

Salva i dati in uno dei seguenti casi:

  • automaticamente di tanto in tanto
  • quando chiami manualmente BGSAVEcommand
  • quando redis si sta spegnendo

Ma i dati in redis non sono realmente persistenti, perché:

  • crash del processo di redis significa perdere tutte le modifiche dall'ultimo salvataggio
  • BGSAVE l'operazione può essere eseguita solo se hai abbastanza RAM libera (la quantità di RAM extra è uguale alla dimensione del DB redis)

NB: BGSAVE requisiti di RAM sono un vero problema, perché redis continua a funzionare fino a quando non c'è più RAM da eseguire, ma interrompe il salvataggio dei dati sull'HDD molto prima (a circa il 50% della RAM).

Per ulteriori informazioni, vedere Redis Persistence .


1
Poiché questa risposta è stata scritta, il redis ha introdotto un modello di persistenza alternativo chiamato AOF che fornisce una persistenza significativamente più elevata, ma presenta alcuni altri svantaggi come un maggiore utilizzo del disco e un avvio più lento del server.
Leonid Beschastny

15

È una questione di configurazione. Non puoi avere nessuna persistenza, parziale o totale dei tuoi dati su Redis.La decisione migliore sarà guidata dalle esigenze tecniche e commerciali del progetto.

Secondo la documentazione di Redis sulla persistenza , puoi configurare la tua istanza per salvare i dati su disco di volta in volta o su ogni query, in poche parole. Forniscono due strategie / metodi AOF e RDB (leggi la documentazione per vedere i dettagli a riguardo), puoi usarli da soli o insieme.

Se vuoi una "persistenza simile a SQL", hanno detto:

L'indicazione generale è che dovresti usare entrambi i metodi di persistenza se vuoi un grado di sicurezza dei dati paragonabile a quello che PostgreSQL può fornirti.


7

La risposta è generalmente , tuttavia una risposta più completa dipende davvero dal tipo di dati che stai cercando di memorizzare. In generale, la risposta breve più completa è:

  • Redis non è la soluzione migliore per l'archiviazione persistente poiché è principalmente focalizzato sulle prestazioni
  • Redis è davvero più adatto per l'archiviazione / cache in memoria affidabile dello stato corrente dati , in particolare per consentire la scalabilità fornendo una fonte centrale per i dati utilizzati su più client / server

Detto questo, per impostazione predefinita Redis manterrà gli snapshot dei dati a intervalli periodici (apparentemente questo è ogni 1 minuto, ma non l'ho verificato - questo è descritto dall'articolo seguente, che è una buona introduzione di base):

http://qnimate.com/redis-permanent-storage/


TL; DR

Dai documenti ufficiali :

  • La persistenza RDB [impostazione predefinita] esegue snapshot point-in-time del set di dati a intervalli specificati.
  • La persistenza AOF [deve essere configurata esplicitamente] registra ogni operazione di scrittura ricevuta dal server, che verrà riprodotta nuovamente all'avvio del server, ricostruendo il dataset originale.

Redis deve essere configurato in modo esplicito per la persistenza AOF, se necessario, e ciò comporterà una riduzione delle prestazioni e un aumento dei registri. Può essere sufficiente per la persistenza relativamente affidabile di una quantità limitata di flusso di dati.


5

Puoi scegliere di non avere alcuna persistenza. Prestazioni migliori ma tutti i dati perdono quando Redis si spegne.

Redis ha due meccanismi di persistenza: RDB e AOF.RDB utilizza uno snapshooting globale dello scheduler e AOF scrive l'aggiornamento in un file di log solo apappend simile a MySql.

Puoi usarne uno o entrambi. Quando Redis si riavvia, costruisce i dati leggendo il file RDB o il file AOF.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.