2014-04-06 14 views
5

Ho bisogno di caricare alcuni campi di informazione che cambiano di rado per la convalida dei percorsi a cui un utente potrebbe accedere.MongoDB vs Redis per le sessioni utente?

Attualmente, interrogo MongoDB e conservare quei campi in Redis a fianco un particolare informazioni di stato in un unico hash che viene digitato da 'user:' + mongodb_user_objectid quando un utente accede a.

Poi ho creare una sessione per il cookie HTTP e negozio questa chiave come una stringa in redis è codificata da 'sess:' + session_id.

Sarebbe meglio non copiare i campi da mongodb e gestire l'aggiornamento di redis e mongodb quando uno di questi campi di convalida potrebbe cambiare?

C'è una significativa differenza di prestazioni dalla lettura e scrittura di queste informazioni di sessione direttamente da/a mongodb senza utilizzare redis come intermediario?

risposta

14

Sfortunatamente, una risposta definitiva richiede una misurazione utilizzando la configurazione perché ci sono così tanti fattori potenziali.

Tuttavia, la mia ipotesi è che il sovraccarico di utilizzare due datastore supera qualsiasi vantaggi potenziali in quanto la legge dovrebbe essere incredibilmente veloce su entrambi i DB:

  • Dal momento che le sessioni saranno utilizzati spesso, la raccolta continua abbastanza "caldo" quindi probabilmente rimarrà nella RAM se possibile in MongoDB, anche
  • Perdere una sessione non sarebbe grandioso, ma non è un disastro, quindi è possibile scrivere su MongoDB senza attendere un commit del journal (che è praticamente la stessa affidabilità che ha redis)
  • In entrambi i casi, la maggior parte di tempo è (probabilmente) spesi per lo stack di rete, e si deve passare attraverso quella sia per il DB

Quindi, in poche parole, non vedo alcun motivo per cui sarebbero Redis molto più veloce in questo caso, ma ancora una volta, le prestazioni sono spesso congetture, soprattutto quando i dettagli sono sconosciuti.

+1

Sono assolutamente d'accordo. di misurazione. Ri. la parte da indovinare - mentre io sono meno intimo con MongoDB, due dei casi d'uso classici di Redis sono la gestione delle sessioni e l'accelerazione/caching del DB. In particolare, poiché MongoDB non è un database in memoria, è comunemente aumentato con Redis in cui le prestazioni sono importanti (ad esempio http://redislabs.com/blog/the-top-3-game-changing-redis-use-cases:)) –

+1

Grazie per il collegamento. Questo è tutto molto vero, ma, come sottolinea il link, il redis brilla davvero quando si tratta anche di * modificare * la sessione * spesso *, tenendo aggiornati i conteggi degli hit, i conteggi delle richieste, ecc. Questo è un punto in cui ha senso separare le operazioni più veloci e voluminose e garantire che le scritture ripetute vadano solo nella RAM. Tuttavia, l'OP non ha detto che stava scrivendo molto spesso, e anche allora, deve essere molto traffico per diventare una differenza importante. – mnemosyn

+0

Quindi, dal momento che mongodb carica interi documenti in memoria, sarebbe uno spreco di RAM se ho solo bisogno di usare pochi campi dal documento mongodb dell'utente in una sessione? – paulkon