Entity Framework Core 是经典 .NET Entity Framework 数据对象关系映射引擎的现代版本。 EF Core 经过重新架构和重写,使其轻量级和跨平台。 使用 EF Core 访问应用程序数据库时,在负载高峰期间可能会出现数据库响应时间延迟。 这极大地损害了您的 EF Core 应用程序性能. 随着应用程序事务负载的增长,您可以通过使用更多应用程序服务器线性扩展应用程序层来适应请求负载。 但是,您不能添加更多的数据库服务器来处理增加的负载。
这是分布式缓存的地方,例如 NCache 发挥作用。 您可以缓存经常访问的数据以提高响应时间。 缓存的分布式特性 NCache for Entity Framework Core 通过使缓存确保在极端事务负载下的最佳性能 线性可扩展 了。
在 Entity Framework Core 中使用缓存
NCache 通过扩展方法为 Entity Framework Core 中的缓存提供集成。 您可以缓存的结果集 LINQ 查询 它们是用于交易数据还是参考数据。 以下扩展方法由 NCache 对于 EF 核心。
缓存 LINQ 查询结果 – FromCache()
让我们以一家航空公司网站为例,该网站希望获取 XNUMX 月份飞往夏威夷的航班。 结果集被更频繁地获取,因此缓存它是一个好主意。
FromCache()
扩展方法首先检查缓存中的查询结果,如果缓存中不存在或已过期,则从数据库中获取并添加到缓存中,从而加快未来请求的响应时间。
运用 NCache,您可以将查询结果集存储为单独的实体或单个集合。 将结果集作为一个整体保存在缓存中是合理的,因为结果集的任何更改都需要从数据库中完全更新。
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 更多信息 Entity Framework Core Cache 配置 EF Core NCache
使用所有参考数据预加载缓存 – LoadIntoCache()
要将缓存用作参考数据的主要可靠数据源,您的整个参考数据应首先位于缓存中。 没有这个,你就不能期望从你的缓存查询中得到正确的结果,因为一些数据可能在数据库中,而查询只是搜索缓存。
将 EF Core 应用程序的参考数据加载到 NCache 使请求访问更快。 LoadIntoCache()
从数据库中获取 LINQ 查询结果集并将数据加载到缓存中。
这是怎么了 LoadIntoCache()
在引擎盖下工作:
让我们继续以电子商店的产品目录为例。 将每个产品存储为单独的实体使其可用于各种查询组合,甚至可以更快地获取单个产品。
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 更多信息 Entity Framework Core Cache NCache LINQ API 文档
使用 LINQ 在缓存中搜索参考数据 – FromCacheOnly()
如果要对缓存运行 LINQ 查询,则必须将整个引用数据加载到缓存中。 否则,您的 LINQ 查询无效,因为某些数据驻留在数据库中,并且在这种情况下 LINQ 查询未搜索数据库。 这与对数据库执行 LINQ 查询并缓存其结果集不同。
以下架构说明了通过 EF Core 执行的查询 NCache 现在:
例如,现在获取具有特定产品 ID 的产品要快得多,因为只访问缓存:
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(); } |
相关链接: Entity Framework Core Cache NCache LINQ API 文档
修改缓存中的 EF Core 实体 – GetCache()
EF Core 允许您在数据库中添加和更新实体。 因此,要将缓存与数据库同步并对缓存中已经存在的实体进行必要的更改, NCache 提供一个缓存句柄,允许您直接对缓存执行添加、更新和删除操作。
例如,如果您想在 EF Core 中添加另一个客户,则在将其添加到数据库后,通过调用 SaveChanges()
在数据库上下文上,您可以通过调用获取缓存上下文 GetCache()
并打电话 Insert()
在返回的缓存实例上。
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); } |
相关链接: Entity Framework Core Cache NCache 缓存类文档 扩展 EF Core 应用程序-网络研讨会
总结思考
通过在 EF Core 中加入缓存 NCache 简单灵活。 NCache 通过复制为您提供 100% 的正常运行时间和数据可靠性,而不会影响缓存的性能,它提供了一个在多服务器环境中运行良好的分布式缓存框架。 因此缓存在 Entity Framework Core 中 NCache 填补了性能和可扩展性的空白,并使其高效。
好文章,通常我使用 Azure 缓存 Redis 通过将数据存储在内存而不是磁盘中来实现卓越的吞吐量和延迟性能。 在定价非常便宜和性能方面,它为响应时间增加了很大的价值。
无论如何,努力用简单的语言解释这个复杂的话题。