Tutte le risposte (al momento della stesura di questo documento) presuppongono che ciascuno di Redis, MongoDB e forse un database relazionale basato su SQL sia essenzialmente lo stesso strumento: "memorizzare i dati". Non considerano affatto i modelli di dati.
MongoDB: dati complessi
MongoDB è un archivio di documenti. Per confrontare con un database relazionale basato su SQL: i database relazionali semplificano i file CSV indicizzati, ogni file essendo una tabella; gli archivi documenti semplificano i file JSON indicizzati, ogni file è un documento, con più file raggruppati insieme.
I file JSON sono simili nella struttura ai file XML e YAML e ai dizionari come in Python, quindi pensa ai tuoi dati in quel tipo di gerarchia. Durante l'indicizzazione, la struttura è la chiave: un documento contiene chiavi denominate, che contengono ulteriori documenti, matrici o valori scalari. Considera il documento seguente.
{
_id: 0x194f38dc491a,
Name: "John Smith",
PhoneNumber:
Home: "555 999-1234",
Work: "555 999-9876",
Mobile: "555 634-5789"
Accounts:
- "379-1111"
- "379-2574"
- "414-6731"
}
Il documento sopra ha una chiave PhoneNumber.Mobile, che ha valore 555 634-5789. Puoi cercare in una raccolta di documenti in cui la chiave PhoneNumber.Mobileha un valore; sono indicizzati.
Ha anche una matrice di Accountscui contiene più indici. È possibile eseguire una query per un documento in cui Accountscontiene esattamente alcuni sottoinsiemi di valori, tutti alcuni sottoinsiemi di valori o uno qualsiasi di alcuni sottoinsiemi di valori. Ciò significa che puoi cercare Accounts = ["379-1111", "379-2574"]e non trovare quanto sopra; puoi cercare Accounts includes ["379-1111"]e trovare il documento sopra; e puoi cercare Accounts includes any of ["974-3785","414-6731"]e trovare quanto sopra e qualunque documento includa l'account "974-3785", se presente.
I documenti vanno in profondità quanto vuoi. PhoneNumber.Mobilepotrebbe contenere un array o persino un documento secondario ( PhoneNumber.Mobile.Worke PhoneNumber.Mobile.Personal). Se i tuoi dati sono altamente strutturati, i documenti rappresentano un grande passo avanti rispetto ai database relazionali.
Se i tuoi dati sono per lo più piatti, relazionali e rigidamente strutturati, stai meglio con un database relazionale. Ancora una volta, il grande segno è se i tuoi modelli di dati si adattano meglio a una raccolta di file CSV correlati o a una raccolta di file XML / JSON / YAML.
Per la maggior parte dei progetti, dovrai scendere a compromessi, accettando una soluzione secondaria in alcune piccole aree in cui SQL o Document Store non si adattano; per alcuni progetti complessi e di grandi dimensioni che archiviano un'ampia gamma di dati (molte colonne; le righe sono irrilevanti), avrà senso archiviare alcuni dati in un modello e altri in un altro modello. Facebook utilizza sia SQL che un database grafico (in cui i dati vengono inseriti nei nodi e i nodi sono collegati ad altri nodi); Craigslist utilizzava MySQL e MongoDB, ma aveva cercato di spostarsi completamente su MongoDB. Questi sono luoghi in cui l'arco e la relazione dei dati affrontano svantaggi significativi se inseriti in un modello.
Redis: valore-chiave
Redis è fondamentalmente un archivio di valori-chiave. Redis ti consente di dargli una chiave e cercare un singolo valore. Redis stesso può memorizzare stringhe, elenchi, hash e poche altre cose; tuttavia, cerca solo per nome.
L'invalidazione della cache è uno dei problemi più difficili dell'informatica; l'altro sta nominando le cose. Ciò significa che utilizzerai Redis quando vuoi evitare centinaia di ricerche in eccesso su un back-end, ma dovrai capire quando hai bisogno di una nuova ricerca.
Il caso più evidente di invalidamento è l'aggiornamento in scrittura: se leggi user:Simon:lingots = NOTFOUND, potresti SELECT Lingots FROM Store s INNER JOIN UserProfile u ON s.UserID = u.UserID WHERE u.Username = Simone archiviare il risultato 100, come SET user:Simon:lingots = 100. Poi, quando si Award Simon 5 lingotti, si legge user:Simon:lingots = 100, SET user:Simon:lingots = 105e UPDATE Store s INNER JOIN UserProfile u ON s.UserID = u.UserID SET s.Lingots = 105 WHERE u.Username = Simon. Ora ne hai 105 nel tuo database e in Redis e puoi ottenerlo user:Simon:lingotssenza interrogare il database.
Il secondo caso è l'aggiornamento delle informazioni dipendenti. Supponiamo che tu generi blocchi di una pagina e memorizzi nella cache il loro output. L'intestazione mostra l'esperienza, il livello e la quantità di denaro del giocatore; la pagina del profilo del giocatore ha un blocco che mostra le sue statistiche; e così via. Il giocatore guadagna esperienza. Bene, ora si dispone di più templates:Header:Simon, templates:StatsBox:Simon, templates:GrowthGraph:Simone così via campi in cui avete memorizzato nella cache l'output di un database di mezza dozzina di query eseguite attraverso un motore di template. Normalmente, quando visualizzi queste pagine, dici:
$t = GetStringFromRedis("templates:StatsBox:" + $playerName);
if ($t == null) {
$t = BuildTemplate("StatsBox.tmpl",
GetStatsFromDatabase($playerName));
SetStringInRedis("Templates:StatsBox:" + $playerName, $t);
}
print $t;
Poiché hai appena aggiornato i risultati di GetStatsFromDatabase("Simon"), devi abbandonare templates:*:Simonla cache dei valori-chiave. Quando si tenta di eseguire il rendering di uno di questi modelli, l'applicazione sfornerà il recupero dei dati dal database (PostgreSQL, MongoDB) e l'inserimento nel modello; quindi memorizzerà il risultato in Redis e, si spera, non si preoccuperà di fare query sul database e modelli di rendering la prossima volta che visualizzerà quel blocco di output.
Redis ti consente anche di creare code di messaggi per gli editori e simili. Questo è un altro argomento interamente. Punto qui è Redis è una cache di valori-chiave, che differisce da un database relazionale o da un archivio documenti.
Conclusione
Scegli i tuoi strumenti in base alle tue esigenze. La necessità maggiore è in genere il modello di dati, in quanto determina la complessità e la propensione all'errore del codice. Le applicazioni specializzate si baseranno sulle prestazioni, luoghi in cui si scrive tutto in una miscela di C e Assembly; la maggior parte delle applicazioni gestirà solo il caso generalizzato e utilizzerà un sistema di memorizzazione nella cache come Redis o Memcached, che è molto più veloce di un database SQL ad alte prestazioni o di un archivio documenti.