Entity Framework Core es una versión moderna del clásico motor de mapeo relacional de objetos de datos de .NET Entity Framework. EF Core se rediseñó y reescribió para que sea liviano y multiplataforma. Al usar EF Core para acceder a la base de datos de su aplicación, puede haber un retraso en el tiempo de respuesta de la base de datos durante las horas pico de carga. Esto compromete drásticamente su Rendimiento de la aplicación EF Core. A medida que crece la carga de transacciones de su aplicación, puede acomodar las cargas de solicitudes escalando linealmente el nivel de la aplicación con más servidores de aplicaciones. Sin embargo, no puede agregar más servidores de bases de datos para manejar el aumento de la carga.
Aquí es donde un caché distribuido como NCache entra en juego. Puede almacenar en caché los datos a los que se accede con frecuencia para mejorar los tiempos de respuesta. La naturaleza distribuida del almacenamiento en caché en NCache para Entity Framework Core garantiza un rendimiento óptimo bajo cargas de transacciones extremas al hacer que el caché linealmente escalable
Uso del almacenamiento en caché en Entity Framework Core
NCache proporciona integración para el almacenamiento en caché en Entity Framework Core a través de métodos de extensión. Puede almacenar en caché los conjuntos de resultados de Consultas LINQ ya sean para datos transaccionales o datos de referencia. Los siguientes métodos de extensión son proporcionados por NCache para EF Núcleo.
Almacenamiento en caché de los resultados de su consulta LINQ – FromCache()
Tomemos un ejemplo del sitio web de una compañía aérea que quiere buscar vuelos a Hawái en julio. El conjunto de resultados se obtiene con más frecuencia, por lo que almacenarlo en caché sería una buena idea.
FromCache()
El método de extensión primero verifica el resultado de la consulta en el caché, si no existe en el caché o se ha vuelto obsoleto, se obtiene de la base de datos y también se agrega al caché, lo que resulta en tiempos de respuesta más rápidos para futuras solicitudes.
Usar NCache, puede almacenar el conjunto de resultados de la consulta como entidades separadas o como una sola colección. Guardar el conjunto de resultados en el caché como una colección completa es razonable aquí, ya que cualquier cambio en el conjunto de resultados requeriría que se actualice completamente desde la base de datos.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
using (var context = new FlightRecordsContext()) { var options = new CachingOptions { // To store as collection in cache StoreAs = StoreAs. Collection }; var resultSet = (from flight in context.Flights where flight.Destination == "Hawaii" && flight.Month == "July" select flight).FromCache(options).ToList(); } |
NCache Detalles Entity Framework Core Cache Configurar EF Core con NCache
Precargar caché con todos los datos de referencia – LoadIntoCache()
Para usar el caché como su fuente de datos principal y confiable para sus datos de referencia, todos sus datos de referencia deben estar primero en el caché. Sin esto, no puede esperar resultados correctos de sus consultas en el caché porque algunos de los datos pueden estar en la base de datos mientras que la consulta solo busca en el caché.
Cargando datos de referencia de su aplicación EF Core en NCache hace que la solicitud acceda mucho más rápido. LoadIntoCache()
obtiene el conjunto de resultados de la consulta LINQ de la base de datos y carga los datos en la memoria caché.
Esta es la forma LoadIntoCache()
funciona bajo el capó:
Sigamos con un ejemplo de catálogo de productos de una tienda electrónica. Almacenar cada producto como una entidad separada lo hace disponible para todo tipo de combinaciones de consultas e incluso recuperaciones más rápidas de un solo producto.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
using (var context = new NorthwindContext()) { var options = new CachingOptions { // To store the result as separate entities in cache StoreAs = StoreAs.SeperateEntities }; var resultSet = (from product in context.Products select product).LoadIntoCache(options); } |
NCache Detalles Entity Framework Core Cache NCache Documentos de la API de LINQ
Buscar datos de referencia en caché con LINQ – FromCacheOnly()
Debe cargar todos los datos de referencia en la memoria caché si desea ejecutar consultas LINQ contra ellos. De lo contrario, sus consultas LINQ no son válidas porque algunos datos residen en la base de datos y las consultas LINQ no buscan en la base de datos en este escenario. Esto es diferente al hacer consultas LINQ en su base de datos y almacenar en caché su conjunto de resultados.
La siguiente arquitectura ilustra la ejecución de consultas a través de EF Core en NCache ahora:
Por ejemplo, obtener el producto con una identificación de producto específica ahora es mucho más rápido ya que el viaje es solo al caché:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
using (var context = new NorthwindContext()) { var options = new CachingOptions { // To store the result as collection in cache StoreAs = StoreAs.Collection }; var resultSet = (from product in context.Products where product.ProductID == MatchingProductID select product).FromCacheOnly(); } |
Enlaces relacionados: Entity Framework Core Cache NCache Documentos de la API de LINQ
Modificación de entidades principales de EF en la caché: GetCache()
EF Core le permite agregar y actualizar entidades en la base de datos. Entonces, para sincronizar el caché con la base de datos y realizar los cambios necesarios en las entidades que ya existen en el caché, NCache proporciona un identificador de caché que le permite realizar operaciones de agregar, actualizar y eliminar directamente en el caché.
Por ejemplo, si desea agregar otro cliente en EF Core, después de agregarlo en la base de datos llamando SaveChanges()
en el contexto de la base de datos, puede obtener el contexto de caché llamando GetCache()
y llama Insert()
en la instancia de caché devuelta.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
using (var database = new NorthwindContext()) { var cust = new Customers { CustomerId = "HANIH", ContactName = "Hanih Moos", ContactTitle = "Sales Representative", CompanyName = "Blauer See Delikatessen" }; var options = new CachingOptions { QueryIdentifier = new Tag("CustomerEntity"), Priority = Runtime.CacheItemPriority.Default }; Cache cache = database.GetCache(); //get NCache instance cache.Insert(cust, out string cacheKey, options); } |
Enlaces relacionados: Entity Framework Core Cache NCache Documentos de clase de caché Escalar aplicaciones EF Core: seminario web
Pensamientos Finales
Incorporación de almacenamiento en caché en EF Core a través de NCache es simple y flexible. NCache proporciona un marco de almacenamiento en caché distribuido que funciona bien en entornos de varios servidores, al brindarle un 100 % de tiempo de actividad y confiabilidad de los datos mediante la replicación, sin comprometer el rendimiento del caché. Por lo tanto, el almacenamiento en caché en Entity Framework Core con NCache llena los vacíos de rendimiento y escalabilidad y lo hace altamente eficiente.
Buen artículo, por lo general utilicé Azure Cache para Redis para lograr un rendimiento superior y un rendimiento de latencia al almacenar datos en la memoria en lugar de en el disco. En términos de precio, muy económico y en términos de rendimiento, agrega un gran valor al tiempo de respuesta.
De todos modos, un gran esfuerzo para explicar el tema complejo en palabras sencillas.