Las aplicaciones web ASP.NET, las aplicaciones de servicio web .NET y otras aplicaciones de servidor .NET necesitan manejar cargas de transacciones extremas sin ralentizarse. Aunque su nivel de aplicación se escala linealmente, el nivel de base de datos y almacenamiento de datos no se escala y, por lo tanto, se convierte en un cuello de botella. Como resultado, toda la aplicación no puede escalar.
Originalmente, simples almacenes de clave-valor distribuidos en memoria como Memcached y después Redis se introdujo en las plataformas Unix/Linux para ayudar a resolver este problema de escalabilidad. Rápidamente se hicieron muy populares, principalmente porque proporcionaban escalabilidad lineal al igual que los niveles de la aplicación y eliminaban el cuello de botella de la base de datos.
NCache Detalles NCache Docs NCache API de cliente
Limitaciones en las tiendas de valores clave
Pero, a pesar de su popularidad, estas soluciones eran muy simples, de naturaleza básica y realmente no resolvieron muchos problemas que enfrentan las aplicaciones de la vida real. Algunas de las áreas donde estas soluciones eran muy débiles incluyeron:
- Falta de alta disponibilidad
- Falta de formas inteligentes de mantener el caché actualizado
- Falta de consultas SQL
- Falta de código de almacenamiento en caché del lado del servidor (p. ej., lectura completa)
Por ejemplo, la alta disponibilidad era tan pobre en Memcached que terceros comenzaron a desarrollar "reparaciones" de alta disponibilidad para él. Pero la arquitectura subyacente no fue diseñada para alta disponibilidad y, por lo tanto, estas soluciones permanecieron de naturaleza bastante limitada. Redis tenían los mismos problemas de disponibilidad, pero luego rediseñaron su producto para incorporar algunas funciones de alta disponibilidad, como la replicación de datos y la compatibilidad con conmutación por error. Pero todavía hay grandes agujeros en todos los productos de la tienda de valores clave como Memcached y Redis. Aquí es donde las soluciones de caché distribuida acudieron al rescate.
Caché distribuida de .NET como 2nd Almacén de valor clave de generación
Un caché distribuido de .NET como NCache por otro lado, fue diseñado desde el primer día para abordar todas las limitaciones mencionadas anteriormente. Entonces, en esencia, NCache es un 2nd Generación a las tiendas de valores clave originales como Memcached y Redis. NCache es un popular caché distribuido de 10 años para .NET.
Clúster de caché dinámica y replicación de datos
Un caché distribuido como NCache tiene un clúster de caché dinámico de recuperación automática que agrupa todos los recursos de CPU y memoria de todos los servidores de caché en el clúster. Al mismo tiempo, NCache proporciona una variedad de topologías de almacenamiento en caché con diferentes estrategias de distribución y replicación de datos. Esto permite NCache para escalar linealmente sin comprometer la alta disponibilidad. Y, incluso si un servidor de caché deja de funcionar, no se produce ninguna pérdida de datos, el clúster de caché continúa ejecutándose y todas las aplicaciones que usan el caché también continúan sin interrupciones.
Mantener el caché actualizado
Otra área donde un caché distribuido como NCache brilla, es mantener los datos actualizados y siempre consistentes con la base de datos. NCache hace esto a través de una variedad de características que incluyen vencimientos, conducción de eventos Dependencia Sql, DbDependency basado en sondeos y soporte para Procedimientos CLR para bases de datos relacionales. Los vencimientos funcionan igual que las tiendas de valores clave, pero Dependencia Sql y DbDependency permiten NCache para sincronizar el caché con cualquier cambio en la base de datos para los datos relacionados. Y, Procedimientos almacenados CLR le permite actualizar directamente el caché desde su base de datos de SQL Server cuando los datos correspondientes cambian.
Esto significa que incluso si una aplicación de terceros cambia datos en la base de datos, NCache se actualiza inmediatamente en consecuencia. El beneficio es que puede almacenar en caché casi todos los datos de su aplicación en lugar de almacenar en caché datos de solo lectura, lo que proporciona un mejor rendimiento y una mayor escalabilidad.
Búsqueda de caché con SQL
Entonces, cuando puede almacenar en caché casi todos sus datos debido a las funciones de "mantener el caché actualizado", se encuentra con los problemas de no poder encontrar datos fácilmente si el único mecanismo es clave-valor. Pero, si pudiera buscar datos basados en atributos, entonces un caché distribuido como NCache se vuelve tan fácil de buscar como una base de datos. NCache le proporciona SQL y consulta LINQ para este propósito.
Además de nuestras localidaded en consultas SQL en función de los atributos del objeto, puede asignar Grupos, Etiquetasy Etiquetas con nombre a los elementos almacenados en caché e incluirlos en sus consultas SQL. A continuación se muestra un ejemplo de consulta SQL en C#. Por ejemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
using Alachisoft.NCache.Runtime; using Alachisoft.NCache.Runtime.Exceptions; using Alachisoft.NCache.Web.Caching; public void SearchDataUsingSQL() { Cache cache = NCache.InitializeCache("myparitionreplica"); string query = "SELECT this.Category, " + "MAX(Prod.Product.ProductID) " + "WHERE this.Category = ? " + "GROUP BY this.Category"; Hashtable values = new Hashtable(); values.Add("Category", 4); ICacheReader reader = cache.ExecuteReader(query, values); if (reader.FieldCount > 0) { while (reader.Read()) { //you can get value through the field name... object category = reader.GetOrdinal("Category"); //perform operations } } reader.Close(); return data; } |
Código del lado del servidor
Finalmente, hay un código del lado del servidor como Leer de parte a parte, Escriba por medio de, Dependencia personalizaday Cargador de caché y actualización eso es muy util Usted desarrolla este código, pero la memoria caché distribuida lo llama y se ejecuta en el clúster de memoria caché. Con la ayuda de este código, puede simplificar sus aplicaciones y mover una gran cantidad de código de uso común al nivel de almacenamiento en caché.
Por ejemplo, NCache llama a su controlador de lectura cuando su aplicación solicita algunos datos que no están en el caché y la aplicación le dice NCache para llamar Read-through en ese caso. De manera similar, puede combinar Lectura completa con vencimientos y sincronizaciones de bases de datos para recargar automáticamente el elemento almacenado en caché en lugar de eliminarlo de la memoria caché.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
using Alachisoft.NCache.Runtime.Caching; using Alachisoft.NCache.Runtime.DatasourceProviders; using Alachisoft.NCache.Runtime.Dependencies; public class SampleReadThruProvider : IReadThruProvider { public void Init(IDictionary parameters, string cacheId) { // Create SQL connection and other initializations at the server side } //Responsible for loading an item from the external data source. public void LoadFromSource(string key, out ProviderCacheItem cacheItem) { //where LoadFromDataSource is the dummy method to load data from data source. object value = LoadFromDataSource(key); //Attach SQL dependency to your object string query = "SELECT ProductID FROM dbo.Products WHERE ProductID = 1001"; cacheItem = new ProviderCacheItem(value); cacheItem.Dependency = new SqlCacheDependency(connectionString, query); //Set expirations cacheItem.SlidingExpiration = new TimeSpan(0, 5, 0); //Indicates whether item should be reloaded on expiration if //ReadThru provider is specified. cacheItem.ResyncItemOnExpiration = true; } public void Dispose() { //... } } |
La escritura simultánea funciona de la misma manera que la lectura simultánea, pero para las actualizaciones. Actualiza su base de datos cuando su aplicación actualiza el caché. Y, si lo prefiere, Write-behind actualiza la base de datos de forma asíncrona aunque la memoria caché se actualice de forma síncrona. Finalmente, Cache Loader se llama cuando se inicia el caché para que pueda precargarlo con los datos deseados.
Conclusión
Como se puede ver, NCache, un caché distribuido de .NET de código abierto, ofrece mucho más poder a su caché que un simple Redis almacén de clave-valor o Memcached. A continuación se muestra una comparación detallada del almacén de valor clave con un servicio de caché distribuida, es decir Redis vs NCache y Memcached vs NCache.