2012-04-23 19 views
63

Attualmente sto usando db (mysql) per memorizzare le mie sessioni. Funziona benissimo ma è un po 'lento.Quanto è sicuro memorizzare la sessione con Redis?

Mi è stato chiesto di utilizzare Redis, ma mi chiedo se siano buone idee perché ho sentito che i ritardi di Redis scrivono operazioni, quindi ho un po 'paura perché le sessioni devono essere tempi reali.

Hai riscontrato problemi del genere?

+1

Poiché Redis dice che ha una durata opzionale, direi che è sicuro usarlo se si opta per la persistenza su HDD. Tuttavia, per i dati di sessione, li salverei sicuramente nella RAM (il che significa che non mi preoccuperei della parte di durata dell'intera esperienza). Il peggio che dovrebbe accadere nel caso in cui si perdono i dati di sessione sta facendo disconnettere gli utenti. –

+1

sì, ma questo è parte del mio requisito, gli utenti non dovrebbero dover eseguire il login, dal momento che alcuni dati degli utenti sono persistenti attraverso la sessione mentre gli utenti non sono loggati (utenti guest). Vanno per Redis RAM ma con registrazione e/o backup abilitati. Se abbiamo perso alcune sessioni è accettabile. – Trent

+0

Bene, se si sta utilizzando una memoria del disco rigido, che senso ha usare Redis? Probabilmente ritarda l'effettivo commit su disco per aumentare le prestazioni, la stessa cosa che MySQL potrebbe fare se configurato in quel modo. Hai pensato di spostare MySQL su un sottosistema I/O più veloce?Non è che Redis funzionerà magicamente 50 volte più velocemente sullo stesso hardware, se deve utilizzare gli stessi sottosistemi di I/O. –

risposta

110

Redis è perfetto per l'archiviazione delle sessioni. Tutte le operazioni vengono eseguite in memoria, quindi le letture e le scritture saranno veloci.

Il secondo aspetto è la persistenza dello stato della sessione. Redis ti dà molta flessibilità su come vuoi mantenere lo stato della sessione sul tuo hard-disk. Si può passare attraverso http://redis.io/topics/persistence per saperne di più, ma a un livello elevato, qui ci sono le opzioni -

  1. Se non può permettersi di perdere tutte le sessioni, impostare appendfsync always nel file di configurazione. Con questo, Redis garantisce che qualsiasi operazione di scrittura venga salvata sul disco. Lo svantaggio è che le operazioni di scrittura saranno più lente.
  2. Se si sta bene perdendo circa 1 valore di dati, utilizzare appendfsync everysec. Questo darà grandi prestazioni con ragionevole garanzie di dati
9

Fondamentalmente sono disponibili due tipi principali: snapshot async e fsync(). Si chiamano rispettivamente RDB e AOF. Altro su persistence modes on the official page.

La gestione del segnale del processo daemonizzato si sincronizza su disco quando riceve un SIGTERM per esempio, quindi i dati saranno ancora lì dopo un riavvio. Penso che il demone o il sistema operativo debba bloccarsi prima che si verifichi un danneggiamento dell'integrità, anche con le impostazioni predefinite (snapshot RDB).

L'impostazione AOF utilizza un file di sola aggiunta che registra i comandi ricevuti dal server e ricrea il database da zero all'avvio a freddo, dal file salvato. Il criterio di sincronizzazione del disco predefinito è eseguire il flush una volta al secondo (IIRC), ma può essere impostato per bloccare e scrivere su ogni comando.

Usando entrambe le istantanee e il registro incrementale sembra offrire sia un lungo periodo non fare-mente-se-I-miss-a-pochi-secondi-dei-dati approccio con un più sicuro, ma costosa registro incrementale. Redis supporta il clustering out of the box, quindi anche la replica può essere eseguita.

Sto utilizzando l'impostazione predefinita di RDB e salvando le istantanee su FTP remoto. Non ho ancora visto un errore che ha causato una perdita di dati. Molto probabilmente un guasto hardware acuto o interruzioni di corrente, ma sono ospitato su un VPS. Sottile possibilità che ciò accada :)

Problemi correlati