Con el tiempo, el almacenamiento en caché distribuido se está volviendo popular, ya que mejora el rendimiento de las aplicaciones y brinda escalabilidad. Y con la necesidad de un método rápido y escalable, las personas almacenan cada vez más datos en la memoria caché. Cuanto mayor sea el rendimiento de la aplicación, mayor será el número de aplicaciones cliente. Sin embargo, existe una alta probabilidad de que su base de datos y el caché no estén sincronizados cuando varios clientes colocan y obtienen datos hacia y desde la fuente de datos. Para contrarrestar este problema, la mayoría de las personas utilizan una técnica de caducidad de datos llamada tiempo de vida (TTL) o Caducidad absoluta. Este vencimiento elimina automáticamente el elemento de caché especificado después del tiempo especificado. Aunque es popular, este mecanismo es una suposición informada sobre cuánto tiempo los datos permanecen sin cambios en el caché.
Si está seguro de que no es probable que sus datos cambien en este período, o si sus datos no son muy confidenciales, lo que significa que puede permitirse el lujo de leer datos obsoletos del caché, entonces puede usar caducidad. Pero si sus datos son confidenciales para el negocio y no puede permitirse el lujo de leer datos inexactos del caché, entonces los datos obsoletos le costarán mucho. En esta situación, acceder a datos desactualizados es un riesgo que no debe correr.
NCache Detalles Tipos de caducidad de datos NCache Docs
Sincronizando NCache con servidor SQL
Para evitar que surja la situación mencionada anteriormente en su aplicación .NET, debe asegurarse de que su caché permanezca sincronizada con la base de datos en todo momento. Y para este propósito exacto, NCache le proporciona una característica de sincronización de base de datos llamada dependencia SQL que le permite mantener su caché sincronizada con la base de datos de SQL Server. Dependencia de SQL utiliza notificaciones de consulta para sincronizar su caché con la base de datos si se produce algún cambio en los conjuntos de datos.
NCache Detalles Dependencia SQL NCache Docs
Notificaciones de consulta en SQL Server
Las notificaciones de consulta son una función de SQL Server que notifica a todos los clientes de la base de datos cuando cambia un conjunto de datos en la base de datos. NCache El servidor usa esta función para convertirse en un cliente de SQL Server y registrarse con SQL Server a través de la Dependencia de SQL.
De esta manera, SQL Server notifica NCache cuando los datos específicos cambian en la base de datos. Y NCache mantiene un mapeo de los elementos almacenados en caché y los conjuntos de datos correspondientes de la base de datos. Con este, NCache puede invalidar el elemento almacenado en caché, por lo que se obtiene una copia nueva de la base de datos la próxima vez que la aplicación lo necesite.
NCache le proporciona la API de dependencia de SQL a través de su API de cliente. Sin embargo, debe proporcionar los siguientes parámetros a través de esta API al agregar elementos en caché a NCache.
- Cadena de conexión: para establecer una conexión con la base de datos.
- ComandoTexto: para determinar el CommandText utilizado por la dependencia.
NCache Detalles Dependencia SQL Configuración del entorno del servidor SQL
Sincronizar NCache con SQL Server: un ejemplo rápido
Supongamos que tiene un sistema de compras en línea basado en .NET con una variedad de artículos que se pueden buscar a los que acceden cientos de clientes simultáneamente. El portal de compras abre el día de Navidad con un 40% de descuento en todo el stock. El servidor de aplicaciones actualiza el precio unitario de los productos en la base de datos mientras que el caché no tiene conocimiento de este cambio.
Si los clientes acceden a los elementos del caché, la copia anterior de estos elementos, sin descuento, permanece disponible. Cuando los clientes buscan productos, obtienen los precios unitarios antiguos de Navidad, lo que hace que los clientes se sientan frustrados e insatisfechos con el negocio.
Pero si usa el NCache característica de sincronización de base de datos con el servidor SQL, el usuario puede habilitar notificaciones para mantener los datos sincronizados con la base de datos para cada actualización. En este caso, la aplicación no se enfrenta a este problema de integridad de datos ya que la memoria caché siempre tiene los datos correctos.
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 |
// Creating connection string to get connected with database. string connectionString = "Server=SERVERNAME; Database=NORTHWIND; UserId=USERID; Password=PASSWORD;"; // Getting products from database. List products = FetchProductFromDB(); // Creating dictionary of CacheItems. Dictionary<string, CacheItem> cacheItems = new Dictionary<string, CacheItem>(); foreach(Product product in products) { string productKey = $"Product: {product.ProductID}"; // Creating an SQL dependency on the unit price of product. Whenever the Unitprice changes, the product is removed from the cache. string query = $"Select UnitPrice from dbo.Products where ProductID = {product.ProductID}"; // Creating dependency on all the products. SqlCacheDependency dependency = new SqlCacheDependency(connectionString, query); CacheItem productItem = new CacheItem(product); // Adding Dependency to product item productItem.Dependency = dependency; } // Adding CacheItems in cache cache.Add(productKey, productItem); |
La razón por la que debería usar el NCache SqlCacheDependency método para sincronizar datos con el servidor SQL es simple. Los datos de su caché nunca se vuelven obsoletos, y puede colocar con confianza todo tipo de datos y recuperarlos sin enfrentar problemas de integridad de datos.
NCache Detalles SqlCacheDependency NCache Docs
Elemento de caché de recarga automática a través del proveedor ReadThru
En lugar de invalidar un elemento almacenado en caché, si desea que el caché lo vuelva a cargar automáticamente cuando sus datos correspondientes cambien en la base de datos, debe implementar el IReadThruProvider interfaz en NCache. Ahora, siempre que NCache recibe una notificación de actualización del servidor SQL en lugar de eliminar ese elemento del caché, NCache llama a su proveedor de ReadThru para obtener los datos actualizados de la base de datos.
Agrega la siguiente línea de código antes de insertar datos en el caché, y NCache maneja la sincronización automática de los datos por usted.
1 2 3 4 5 6 7 8 9 |
// Create a new cache item and add sql dependency to it CacheItem item = new CacheItem(product); item.Dependency = sqlDependency; // Resync if enabled, will automatically resync cache with SQL server item.ResyncOptions = new ResyncOptions(true); // Add cache item in the cache with SQL Dependency and Resync option enabled cache.Insert(key, item); |
NCache Detalles Lectura de proveedores de fuentes de datos NCache Docs
Consultas parametrizadas en dependencias de SQL
Demasiados cambios en la base de datos requieren una invalidación frecuente de los elementos almacenados en caché. Para cada invalidación de datos, se debe proporcionar una consulta SELECT. Y esto significa que SQL Server necesita compilar esta consulta SQL antes de ejecutarla. Esto provoca una degradación del rendimiento porque la compilación de consultas lleva mucho tiempo.
Para solucionar este problema de rendimiento, NCache le permite usar consultas SQL parametrizadas donde especifica valores de parámetros en tiempo de ejecución, y estos valores cambian en cada ejecución. Aquí, la consulta SQL en sí se compila en la primera ejecución y ya no necesita volver a compilarse, lo que ahorra mucho tiempo y mejora el rendimiento.
Para usar consultas parametrizadas en su aplicación, en lugar de escribir una consulta de selección normal, implemente la siguiente consulta.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
// Creating Param to be passed in stored procedure dictionary. SqlCmdParams paramProductID = new SqlCmdParams { Type = CmdParamsType.Int, Value = product.ProductID }; // Creating stored procedure params. Dictionary<string, SqlCmdParams> parameter = new Dictionary<string, SqlCmdParams>(); parameters.Add("@ProductID", paramProductID); CacheItem productItem = new CacheItem(product); /*Creating an SQL dependency on the unit price of the product. Whenever the unit price changes, the product is removed from the cache*/ SqlCacheDependency dependency = new SqlCacheDependency(connectionString, query, SqlCommandType.Text, parameters); // Adding Dependency to the product item productItem.Dependency = dependency; cache.Add(productKey, productItem); |
NCache Detalles SqlCacheDependency SqlCacheDependency
Dependencia SQL basada en procedimientos almacenados
Muchas organizaciones prefieren mantener todas sus consultas SQL utilizadas por sus aplicaciones dentro de su base de datos en forma de procedimientos almacenados. Esto mejora el rendimiento porque todos estos procedimientos almacenados están precompilados y se ejecutan mucho más rápido que las consultas SQL dinámicas. En segundo lugar, pueden mantener todas las consultas SQL de acceso a la base de datos en un solo lugar y no dispersas dentro de cada aplicación, lo que es difícil de modificar si desean actualizar sus consultas SQL.
Para estas organizaciones, NCache admite la dependencia de SQL basada en procedimientos almacenados donde, en lugar de especificar una consulta SQL dinámica o incluso una consulta SQL parametrizada, puede especificar una llamada de procedimiento almacenado.
La siguiente consulta SQL crea un procedimiento con ProductID como parámetro. Este procedimiento almacenado se puede usar en su aplicación para sincronizar el caché con la base de datos.
1 2 3 4 |
create PROCEDURE sp_GetUnitPriceByProductID @ProductID int as Select UnitPrice from dbo.Products where ProductID = @ProductID; |
Para llamar a este procedimiento almacenado en su aplicación .NET, use el siguiente fragmento de código.
1 2 3 4 5 6 7 8 9 10 11 |
// Specifying stored procedure, created in database. string spGetUnitPriceByProductID = "sp_GetUnitPriceByProductID"; /*Creating an SQL dependency on the unit price of product. Whenever the unitprice changes, the product is removed from the cache*/ SqlCacheDependency dependency = new SqlCacheDependency(connectionString, spGetUnitPriceByProductID, SqlCommandType.StoredProcedure, parameters); // Adding Dependency to product item productItem.Dependency = dependency; cache.Add(productKey, productItem); |
NCache Detalles Procedimientos almacenados consulta SQL
Conclusión
Si no está usando NCache como fuente de datos primaria para una aplicación basada en ASP.NET, comience a usarla ahora como:
- NCache es una solución en memoria que no necesita la interferencia del cliente para reequilibrar automáticamente los datos, lo que hace que su aplicación sea extremadamente flexible.
- Le permite agregar tantos servidores como desee en tiempo de ejecución, brindándole la solución más escalable para su aplicación .NET.
Si tiene una aplicación ASP.NET, pero la base de datos que está utilizando no admite notificaciones, NCache le proporciona un método llamado dependencia basada en sondeos.