El almacenamiento en caché distribuido se ha convertido en una forma popular de mejorar el rendimiento y la escalabilidad de las aplicaciones .NET. Es por eso que los desarrolladores están almacenando en caché cada vez más datos en caché distribuida. Sin embargo, junto con esto vienen algunos desafíos. Un desafío importante es garantizar que los datos en el caché estén siempre sincronizados con la base de datos. Esto se debe a que la caché guarda una copia de los datos que ya existen en la base de datos.
Si tiene varias aplicaciones que actualizan los mismos datos en la base de datos pero no todas tienen acceso al caché distribuido, terminará en una situación en la que los datos en el caché son más antiguos y diferentes a su contraparte en la base de datos. Y, si bien esto puede estar bien para algunos tipos de datos de referencia, definitivamente no es aceptable para los datos transaccionales. Los datos de referencia son aquellos que lee mucho pero que no modifica con mucha frecuencia (p. ej., catálogo de productos), mientras que los datos transaccionales son algo que lee y modifica con frecuencia (p. ej., datos de clientes o cuentas).
NCache Detalles Documentos de dependencia de caché NCache Docs
¿Cómo se asegura de que la memoria caché distribuida permanezca sincronizada con la base de datos?
La respuesta es SqlCacheDependency
. Es parte de ASP.NET Cache (System.Web.Caching) y le permite especificar un conjunto de datos en la base de datos con una instrucción SQL y luego recibir notificaciones de eventos .NET de SQL Server 2005/2008 siempre que su conjunto de datos se modifique en la base de datos. .
NCache ha incorporado internamente SqlCacheDependency
a fin de sincronización de caché con SQL Server 2005/2008 o base de datos Oracle. Para ti, NCache proporciona una interfaz similar llamada SqlDependency que le permite especificar una instrucción SQL que represente una o más filas en una tabla dada que conforman su elemento almacenado en caché. NCache luego utiliza internamente SqlCacheDependency
para establecer un enlace con la base de datos contra estas filas.
Por lo tanto, si una de sus aplicaciones actualiza sus datos en la base de datos, SQL Server activa una notificación de evento .NET que NCache captura y elimina el elemento correspondiente de la memoria caché distribuida. Esto resuelve el problema de inconsistencia de datos de tener dos copias diferentes de los mismos datos. Esto se debe a que cuando su aplicación quiere los mismos datos la próxima vez, no los encuentra en el caché y se ve obligado a recuperar la última copia de la base de datos que luego también almacena en caché. De esta manera, NCache asegura que los datos en el caché siempre sean consistentes con los datos en la base de datos.
Aquí hay un ejemplo de código fuente del uso de SqlDependency de NCache que utiliza internamente SqlCacheDependency
:
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
public class Program { // A standard Load method that loads a single row from database public Customer LoadCustomer(Customer cust) { String key = "Customer:CustomerID:" + cust.CustomerID; Customer cust2 = (Customer)NCache.Cache.Get(key); if (cust2 != null) return cust2; CustomerFactory custFactory = new CustomerFactory(); // Load a single customer from the database // SELECT * FROM Customers WHERE CustomerID = 'ALFKI' custFactory.Load(cust); // Create a SqlCacheDependency for this item CacheItem item = new CacheItem(cust); item.Dependency = SqlDependencyFactory(connectionString, "SELECT CustomerID FROM Customers WHERE CustomerID = '" + cust.CustomerID + "'"); // Store item in the cache along with SqlCacheDependency NCache.Cache.Insert(key, item); return cust; } // A query method public List<Customer> FindCustomers(String city) { String key = "List<Customer>:City:" + city; List<Customer> custList = (List<Customer>)NCache.Cache.Get(key); if (custList != null) return custList; CustomerFactory custFactory = new CustomerFactory(); // Load a list of customers from database based on a criteria // SELECT * FROM Customers WHERE City = 'San Francisco' custList = custFactory.FindByCity(city); // Create a SqlCacheDependency for this list of customers CacheItem item = new CacheItem(custList); item.Dependency = SqlDependencyFactory.(connectionString, "SELECT CustomerID FROM Customers WHERE City = '" + city + "'"); // Store list of customers in the cache along with SqlCacheDependency NCache.Cache.Insert (key, item); return custList; } } |
Dependencia de caché en SQL Dependencia de caché de Oracle DB Dependencia de caché personalizada
En resumen, la función SqlDependency de NCache le permite sincronizar el caché con la base de datos y mantener la integridad de los datos. Ahora puede comenzar a almacenar en caché todos los datos sin temor a utilizar datos obsoletos del caché. Y, por supuesto, cuantos más datos almacene en caché, mejor será el rendimiento y la escalabilidad de su aplicación.
Por lo tanto, descargue una versión de prueba de 60 días totalmente funcional de NCache Enterprise y pruébalo por ti mismo.