Todas las respuestas (en el momento de escribir este artículo) asumen que cada una de Redis, MongoDB y quizás una base de datos relacional basada en SQL son esencialmente la misma herramienta: "almacenar datos". No consideran los modelos de datos en absoluto.
MongoDB: datos complejos
MongoDB es una tienda de documentos. Para comparar con una base de datos relacional basada en SQL: las bases de datos relacionales se simplifican a archivos CSV indexados, cada archivo es una tabla; Los almacenes de documentos se simplifican a archivos JSON indexados, cada archivo es un documento, con múltiples archivos agrupados.
Los archivos JSON tienen una estructura similar a los archivos XML y YAML, y a los diccionarios como en Python, así que piense en sus datos en ese tipo de jerarquía. Al indexar, la estructura es la clave: un documento contiene claves con nombre, que contienen documentos adicionales, matrices o valores escalares. Considere el siguiente documento.
{
_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"
}
El documento anterior tiene una clave PhoneNumber.Mobile
, que tiene valor 555 634-5789
. Puede buscar en una colección de documentos donde la clave PhoneNumber.Mobile
, tiene algún valor; Están indexados.
También tiene una variedad de los Accounts
cuales contienen múltiples índices. Es posible consultar un documento que Accounts
contenga exactamente algún subconjunto de valores, todos algunos subconjuntos de valores o cualquiera de algunos subconjuntos de valores. Eso significa que puede buscar Accounts = ["379-1111", "379-2574"]
y no encontrar lo anterior; puede buscar Accounts includes ["379-1111"]
y encontrar el documento anterior; y puede buscar Accounts includes any of ["974-3785","414-6731"]
y encontrar lo anterior y cualquier documento que incluya la cuenta "974-3785", si corresponde.
Los documentos son tan profundos como quieras. PhoneNumber.Mobile
podría contener una matriz o incluso un subdocumento ( PhoneNumber.Mobile.Work
y PhoneNumber.Mobile.Personal
). Si sus datos están altamente estructurados, los documentos son un gran paso adelante de las bases de datos relacionales.
Si sus datos son principalmente planos, relacionales y rígidamente estructurados, es mejor que tenga una base de datos relacional. Una vez más, la gran señal es si sus modelos de datos son mejores para una colección de archivos CSV interrelacionados o una colección de archivos XML / JSON / YAML.
Para la mayoría de los proyectos, tendrá que comprometerse, aceptando una solución menor en algunas áreas pequeñas donde SQL o Document Stores no encajan; Para algunos proyectos grandes y complejos que almacenan una amplia variedad de datos (muchas columnas; las filas son irrelevantes), tendrá sentido almacenar algunos datos en un modelo y otros datos en otro modelo. Facebook usa SQL y una base de datos gráfica (donde los datos se colocan en nodos y los nodos se conectan a otros nodos); Craigslist solía usar MySQL y MongoDB, pero había estado pensando en mudarse por completo a MongoDB. Estos son lugares donde el alcance y la relación de los datos se enfrentan a desventajas significativas si se colocan bajo un modelo.
Redis: valor-clave
Redis es, básicamente, una tienda de valores clave. Redis le permite darle una clave y buscar un valor único. Redis mismo puede almacenar cadenas, listas, hashes y algunas otras cosas; sin embargo, solo busca por nombre.
La invalidación de caché es uno de los problemas más difíciles de la informática; el otro es nombrar cosas. Eso significa que usará Redis cuando desee evitar cientos de búsquedas excesivas en un back-end, pero tendrá que averiguar cuándo necesita una nueva búsqueda.
El caso más obvio de invalidación es la actualización en escritura: si lee user:Simon:lingots = NOTFOUND
, puede SELECT Lingots FROM Store s INNER JOIN UserProfile u ON s.UserID = u.UserID WHERE u.Username = Simon
almacenar el resultado 100
, como SET user:Simon:lingots = 100
. Entonces, cuando usted define el Simon 5 lingotes, que lee user:Simon:lingots = 100
, SET user:Simon:lingots = 105
y UPDATE Store s INNER JOIN UserProfile u ON s.UserID = u.UserID SET s.Lingots = 105 WHERE u.Username = Simon
. Ahora tiene 105 en su base de datos y en Redis, y puede obtener user:Simon:lingots
sin consultar la base de datos.
El segundo caso es actualizar la información dependiente. Supongamos que genera fragmentos de una página y almacena en caché su salida. El encabezado muestra la experiencia, el nivel y la cantidad de dinero del jugador; la página de Perfil del jugador tiene un bloque que muestra sus estadísticas; Etcétera. El jugador gana algo de experiencia. Bueno, ahora usted tiene varias templates:Header:Simon
, templates:StatsBox:Simon
, templates:GrowthGraph:Simon
, y así sucesivamente campos donde se ha almacenado en caché la salida de una base de datos de media docena de consultas se ejecutan a través de un motor de plantillas. Normalmente, cuando muestra estas páginas, dice:
$t = GetStringFromRedis("templates:StatsBox:" + $playerName);
if ($t == null) {
$t = BuildTemplate("StatsBox.tmpl",
GetStatsFromDatabase($playerName));
SetStringInRedis("Templates:StatsBox:" + $playerName, $t);
}
print $t;
Debido a que acaba de actualizar los resultados de GetStatsFromDatabase("Simon")
, debe abandonar templates:*:Simon
su caché de valores clave. Cuando intente representar cualquiera de estas plantillas, su aplicación eliminará los datos de su base de datos (PostgreSQL, MongoDB) y los insertará en su plantilla; luego almacenará el resultado en Redis y, con suerte, no se molestará en hacer consultas a la base de datos y generar plantillas la próxima vez que muestre ese bloque de salida.
Redis también le permite hacer colas de mensajes de suscripción de editor y demás. Ese es otro tema completamente. El punto aquí es que Redis es un caché de valores clave, que difiere de una base de datos relacional o un almacén de documentos.
Conclusión
Elija sus herramientas según sus necesidades. La mayor necesidad es generalmente el modelo de datos, ya que eso determina cuán complejo y propenso a errores es su código. Las aplicaciones especializadas se basarán en el rendimiento, lugares donde puede escribir todo en una mezcla de C y ensamblaje; la mayoría de las aplicaciones solo manejarán el caso generalizado y usarán un sistema de almacenamiento en caché como Redis o Memcached, que es mucho más rápido que una base de datos SQL de alto rendimiento o un almacén de documentos.