MongoDB es una plataforma popular NoSQL base de datos, especialmente para las modernas .NET aplicaciones. Sin embargo, todavía se basa en disco, lo que podría generar problemas de rendimiento en situaciones con tráfico significativo, a pesar de su flexibilidad. escalabilidady poderoso preguntando capacidades. Aquí es donde NCache, una solución de almacenamiento en caché distribuido en memoria.
Presentamos: NCache Como capa de almacenamiento en caché para MongoDB, permite a las aplicaciones .NET reducir drásticamente las consultas a la base de datos, mejorar los tiempos de respuesta y gestionar grandes volúmenes de transacciones de forma eficiente. Este artículo explica cómo integrar... NCache con MongoDB, mejores prácticas para almacenar en caché los resultados de las consultas y estrategias para mantener el caché y la base de datos sincronizados.
Esta guía explica cuándo almacenar en caché los datos de MongoDB, qué datos no deben almacenarse en caché y cómo las aplicaciones .NET pueden mantener sincronizados de forma segura la caché y la base de datos. Es especialmente útil para APIs con un alto volumen de lectura, paneles de control y microservicios con alto tráfico. En resumen: MongoDB sigue siendo el sistema de registro, mientras que NCache Actúa como una capa de lectura en memoria de alta velocidad.
Puntos Clave
- MongoDB está basado en disco, Esto a menudo se convierte en un cuello de botella para el rendimiento de las aplicaciones .NET con alto tráfico. En este caso, una capa de caché en memoria reduce significativamente la carga de la base de datos.
- NCache actúa como un caché distribuido en memoria para MongoDB, permitiendo que los datos a los que se accede con frecuencia se sirvan desde la memoria caché en lugar de desde la base de datos, lo que da como resultado un rendimiento más rápido y una escalabilidad mejorada.
- La caché del cliente en NCache Proporciona velocidades InProc para la aplicación porque se encuentra dentro del proceso de la aplicación y, sin embargo, permanece sincronizado con el caché distribuido.
- El patrón Cache-Aside se utiliza comúnmente con MongoDB, donde la aplicación primero verifica NCache para los datos y luego va a MongoDB solo si los datos no se encuentran en el caché.
- Los flujos de cambios de MongoDB se pueden utilizar para mantener sincronizados los datos de caché. permitiendo actualizaciones de caché en tiempo real cada vez que se insertan, actualizan o eliminan documentos en MongoDB.
- NCache permite realizar consultas de estilo SQL en datos MongoDB almacenados en caché, haciendo posible filtrar y buscar objetos almacenados en caché de forma más inteligente sin consultar directamente a MongoDB.
- El almacenamiento en caché de colecciones enteras o documentos individuales depende de los patrones de acceso: El almacenamiento en caché masivo mejora las lecturas por lotes, mientras que el almacenamiento en caché a nivel de elemento con etiquetas permite un control detallado y una invalidación selectiva.
- NCache es ideal para aplicaciones .NET que utilizan MongoDB, ofrece almacenamiento en caché de objetos .NET nativos y funciones de almacenamiento en caché del lado del servidor como lectura simultánea y escritura posterior.

Figura: Caché distribuida usando MongoDB
¿Por qué el almacenamiento en caché es fundamental para el rendimiento de MongoDB?
Es beneficioso para las aplicaciones .NET por las siguientes razones:
- Almacenamiento flexible basado en documentos:Esto simplifica la organización de datos debido a su diseño sin esquema.
- Arquitectura distribuida: Activa replicación y particionamiento para la escalabilidad.
- Índices & Marco de agregación: Hace complejo consultas eficiente.
- Flujos de cambio: Captura modificaciones de datos en tiempo real a través de flujos de cambios.
Cuellos de botella en el rendimiento de MongoDB
Tiene los siguientes problemas de rendimiento:
- Latencia de lectura/escritura y sobrecarga de E/S de disco: Dado que MongoDB es una base de datos basada en disco, las operaciones frecuentes de lectura y escritura generan una mayor latencia en comparación con las soluciones en memoria. La sobrecarga de E/S de disco aumenta con el volumen de datos, lo que afecta los tiempos de respuesta y el rendimiento general del sistema.
- Consultas de conjuntos de datos grandes: A medida que aumenta el tamaño del conjunto de datos, aumenta el tiempo de ejecución de las consultas porque lleva más tiempo escanear y procesar más documentos. Índices son útiles en este sentido, pero no siempre son suficientes, sobre todo cuando se filtran o agregan grandes volúmenes de datos.
- Escalabilidad organizacional Desafíos: Si bien tiene soporte integrado para escalamiento horizontal mediante fragmentación, trabajar con clústeres grandes puede presentar problemas replicacionales, balanceo de cargay las complejidades de la red. La optimización del rendimiento se vuelve crucial a medida que aumenta el volumen de tráfico.
- Alta latencia para datos de acceso frecuente: Las consultas a datos de acceso frecuente pueden reducir el rendimiento si acceden repetidamente a la base de datos en lugar de ser atendidas desde una capa de almacenamiento más rápida. Esto provoca un aumento en la utilización de recursos y retrasos en los tiempos de respuesta.
Ventajas del uso NCache con MongoDB
NCache, un caché distribuida en memoria, es la mejor opción para su aplicación MongoDB:
- Rendimiento en memoria: NCache es una solución de almacenamiento en caché 100% en memoria, que elimina la E/S de disco y garantiza una latencia ultrabaja para una recuperación de datos más rápida.
- Caché del cliente (velocidad InProc):Reside en el servidor de aplicaciones dentro del proceso de aplicación, minimizando las llamadas de red y garantizando un acceso rápido.
- Escalabilidad lineal:Se escala dinámicamente agregando servidores de caché a medida que crece la carga de datos, lo que evita cuellos de botella y garantiza un alto rendimiento.
- Alta disponibilidad:Garantiza acceso ininterrumpido con replicación automática y conmutación por error, manteniendo el caché operativo incluso durante fallas del servidor.
Arquitectura: Cómo funciona el almacenamiento en caché en MongoDB con NCache
NCache Se adapta perfectamente a su aplicación gracias a su arquitectura dinámica:
- soportes Leer de parte a parte y Escriba por medio de almacenamiento en caché para reducir las consultas directas a la base de datos.
- Se integra perfectamente con .NET 8 y entornos en la nube (Azure, AWS, Kubernetes).
Paso a paso: Implementar el almacenamiento en caché de MongoDB con NCache
Puede implementar fácilmente el almacenamiento en caché de MongoDB con NCache como se demuestra a continuación:
Almacenamiento en caché de resultados de consultas en MongoDB
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
ICache cache = CacheManager.GetCache("MongoDBCache"); string cacheKey = "Customer:EINSTEIN"; Customer customer = cache.Get<Customer>(cacheKey); if (customer == null) { var collection = new MongoClient("mongodb://your-mongodb-url") .GetDatabase("ECommerceDB") .GetCollection<Customer>("Customers"); customer = await collection.Find(x => x.Id == "EINSTEIN").FirstOrDefaultAsync(); if (customer != null) { cache.Insert(cacheKey, new CacheItem(customer) { Expiration = new Expiration(ExpirationType.Absolute, TimeSpan.FromMinutes(5)) }); } } |
Almacenamiento en caché de una colección de MongoDB como un único elemento
Puede almacenar en caché fácilmente colecciones de MongoDB. Almacenar una colección completa como un único elemento de caché permite una recuperación rápida en una sola operación, lo que reduce las búsquedas en caché y mejora el rendimiento del procesamiento por lotes o la representación de la interfaz de usuario.
|
1 2 3 4 5 6 7 8 9 10 |
var customersInGermany = await collection.Find(x => x.Country == "Germany").ToListAsync(); if (customersInGermany.Count > 0) { ICache cache = CacheManager.GetCache("MongoDBCache"); var cacheItem = new CacheItem(customersInGermany) { Expiration = new Expiration(ExpirationType.Absolute, TimeSpan.FromMinutes(10)) }; cache.Insert("Customers:Germany", cacheItem); } |
Almacenamiento en caché de elementos de la colección MongoDB por separado
Puede almacenar fácilmente en caché colecciones de MongoDB. Almacenar cada elemento por separado garantiza el acceso individual, mientras que el uso de etiquetas agrupa elementos relacionados, lo que agiliza la recuperación masiva y mejora el rendimiento de las consultas.
|
1 2 3 4 5 6 7 8 9 |
foreach (var customer in customersInGermany) { var cacheItem = new CacheItem(customer) { Tags = new Tag[] { new Tag("Customer:Country:Germany") }, Expiration = new Expiration(ExpirationType.Absolute, TimeSpan.FromMinutes(10)) }; cache.Insert($"Customer:CustomerID:{customer.Id}", cacheItem); } |
Mantenga la caché y la base de datos sincronizadas mediante flujos de cambios
Para garantizar la coherencia de los datos entre MongoDB y la caché, los flujos de cambio permiten la sincronización en tiempo real mediante la detección insertos, <font style="vertical-align: inherit;" class="">actualizaciones sobre los portfolios ilustrativos de Small Caps y de todos los activos</font>, y eliminaSiempre que los datos cambien, NCache puede eliminar o actualizar la entrada de caché correspondiente, evitando problemas de datos obsoletos.
|
1 2 3 4 5 6 7 8 9 |
var pipeline = new EmptyPipelineDefinition<ChangeStreamDocument<Customer>>() .Match("{ operationType: { $in: ['insert', 'update', 'replace', 'delete'] } }"); var cursor = collection.Watch(pipeline); await cursor.ForEachAsync(change => { string cacheKey = $"Customer:CustomerID:{change.FullDocument.Id}"; cache.Remove(cacheKey); }); |
Consulta de datos almacenados en caché en NCache
NCache Permite a los usuarios consultar datos en caché mediante consultas SQL, lo que reduce la carga de la base de datos y mejora el rendimiento de la aplicación. Las consultas indexadas permiten búsquedas y filtrados más rápidos de objetos en caché.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// Connect to NCache ICache cache = CacheManager.GetCache("MongoDBCache"); // Define NCache search query string query = "SELECT * FROM Models.Customer WHERE Country = ?"; var queryCommand = new QueryCommand(query); queryCommand.Parameters.Add("Country", "Germany"); // Execute query on cache ICacheReader reader = cache.SearchService.ExecuteReader(queryCommand); while (reader.Read()) { string contactName = reader.GetValue<string>("ContactName"); Console.WriteLine($"Contact Name: {contactName}"); } |
Cómo configurar NCache ¿para MongoDB?
Para configurar NCache Para MongoDB, siga los pasos a continuación:
A. Instalar NCache Cliente
Para instalar el NCache Cliente en una aplicación .NET, use NuGet para agregar el paquete requerido:
|
1 |
Install-Package Alachisoft.NCache.SDK |
Una vez instalado, configure su aplicación para usarla NCache para almacenar datos en caché.
B. Instalar NCache Server
Para instalar NCache Servidor en Linux:
|
1 2 3 |
docker pull alachisoft/ncache:latest docker run -d --name ncache-server --network host alachisoft/ncache:latest docker exec -it ncache-server ncache service start |
C. Configurar NCache para MongoDB
Para integrar MongoDB con NCache, siga estos pasos:
- Crear y configurar caché:
|
1 2 |
New-Cache -Name MongoDBCache -Size 1024 -Topology PartitionReplica -Server 192.168.1.2 Add-Node -CacheName MongoDBCache -Server 192.168.1.3 |
- Modificar la aplicación .NET para usar NCache:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
ICache cache = CacheManager.GetCache("MongoDBCache"); var collection = new MongoClient("mongodb://your-mongodb-url") .GetDatabase("ECommerceDB") .GetCollection<Customer>("Customers"); var customer = await collection.Find(x => x.Id == "EINSTEIN").FirstOrDefaultAsync(); if (customer != null) { cache.Insert("Customer:EINSTEIN", new CacheItem(customer) { Expiration = new Expiration(ExpirationType.Absolute, TimeSpan.FromMinutes(10)) }); } |
Conclusión
El uso de NCache Con MongoDB, se mejora el rendimiento de las aplicaciones al reducir la carga de la base de datos, optimizar los tiempos de respuesta y garantizar la consistencia de los datos en tiempo real. Al aprovechar el almacenamiento en caché en memoria, las aplicaciones se benefician de un acceso más rápido a los datos, una menor latencia y una escalabilidad fluida. NCacheLa arquitectura distribuida de proporciona alta disponibilidad y garantiza tolerancia a fallas, lo que la convierte en una opción ideal para aplicaciones .NET modernas y de alto tráfico que utilizan MongoDB.
Preguntas frecuentes
P: ¿Por qué utilizar? NCache ¿Si MongoDB ya es escalable?
A: Si bien MongoDB escala bien, la E/S de disco eventualmente se convierte en un cuello de botella. NCache descarga el tráfico de lectura pesada a la memoria, lo que es significativamente más rápido y permite que la base de datos se concentre en operaciones de escritura y consultas complejas.
P: ¿Cómo se mantiene la memoria caché sincronizada con la base de datos?
A: Como se detalla en la Sección 6, NCache puede aprovechar MongoDB Change Streams para escuchar actualizaciones en tiempo real en la base de datos e invalidar o actualizar elementos almacenados en caché en consecuencia, lo que garantiza la consistencia de los datos.
P: ¿Puedo usar SQL con datos de MongoDB?
A: No se puede ejecutar SQL en MongoDB directamente, pero una vez que los objetos están dentro NCache, puedes usar NCacheCapacidades de consulta SQL para buscar y filtrar datos utilizando la sintaxis SQL estándar.
Q: es NCache mejor que Redis ¿Para aplicaciones .NET MongoDB?
A: NCache A menudo se prefiere en entornos .NET porque es 100% .NET nativo, mientras que Redis está basado en Linux. Esto significa NCache se integra perfectamente en el ecosistema de Visual Studio, ofrece una mejor serialización para objetos .NET complejos y le permite ejecutar código .NET del lado del servidor (como proveedores de lectura simultánea/escritura posterior) directamente en los nodos de caché, lo que Redis No se puede hacer de forma nativa.
P: ¿Necesito convertir documentos BSON de MongoDB antes de almacenarlos en caché?
A: Sí. NCache Almacena objetos nativos de .NET, no documentos BSON. Debe deserializar sus datos BSON de MongoDB en clases .NET estándar (POCO) antes de insertarlos en la caché. Esto le permite aprovechar NCacheLas funciones de consulta e indexación de SQL de , que funcionan en atributos de objeto, no en bytes BSON sin formato.
Q: ¿Puede NCache ¿Escribir datos automáticamente en MongoDB?
A: Sí. Si bien esta guía se centró en el patrón "Cache-Aside" (donde su aplicación actualiza manualmente la base de datos), NCache apoya Escriba por medio de y Escritura posterior proveedores. Estos le permiten transferir la operación de escritura a NCache, que luego actualiza MongoDB de forma sincrónica (escritura simultánea) o asincrónica (escritura posterior) en segundo plano, lo que mejora aún más la latencia de la aplicación.
P: ¿Qué sucede si el NCache ¿el cluster se cae?
A: Su aplicación se degradará sin problemas, pero seguirá funcionando. Dado que el patrón estándar "Caché Aside" incluye una lógica de respaldo (si la caché es nula, se recupera de la base de datos), su aplicación simplemente comenzará a acceder directamente a MongoDB. El rendimiento se reducirá a niveles sin caché, pero no se perderán datos y la aplicación permanecerá en línea.






