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.Mobile
ha un valore; sono indicizzati.
Ha anche una matrice di Accounts
cui contiene più indici. È possibile eseguire una query per un documento in cui Accounts
contiene 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.Mobile
potrebbe contenere un array o persino un documento secondario ( PhoneNumber.Mobile.Work
e 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 = Simon
e 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 = 105
e 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:lingots
senza 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:Simon
e 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:*:Simon
la 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.