如今,许多企业需要处理能力来在高峰时段处理大量事务和参考数据。 例如,银行在假期处理客户交易。 然而,一个巨大的挑战是在不影响应用程序性能的情况下处理这些数据。 通常,应用程序层是线性可扩展的,但数据库不是。 高事务负载可能导致数据库瓶颈并使您的系统不堪重负。 这个瓶颈可以通过向 .NET 应用程序引入内存分布式缓存来解决,以便更快地访问数据。
内存中分布式缓存跨越多个服务器,但作为单个缓存实例工作,并且对使用它的应用程序是透明的。 它减少了后端服务器和数据库的负载,因为任何活动或瞬态数据都是从缓存中提供的。
NCache 是一个 开放源码, 内存分布式缓存,适用于 .NET 和基于 Java 的应用程序。 NCache 随着新服务器添加到此缓存集群以满足您不断增长的性能需求,有助于实现快速的事务处理速度和数据一致性。
下图说明了这种架构:
缓存数据在所有服务器之间平均分布,甚至复制,以避免数据丢失并确保 高可用性. 因此,分布式缓存每秒处理数十万个请求,从而防止在峰值负载期间出现停机。
这种分布式结构确保不会出现单点故障,就好像即使一个缓存服务器出现故障,它也会从其他服务器节点接收数据。 因此,您的业务不会受到影响,并且可以在需要时轻松地将更多服务器添加到分布式缓存中。
理想的缓存数据包括频繁读取但偶尔更改以实现分布式缓存的最大性能。 分布式缓存将数据存储为 核心价值 对,从而使其易于使用和访问。
运用 NCache 作为分布式缓存
除了显着提升您的 .NET 应用程序的性能外,分布式缓存(如 NCache 提供多个 高级功能 这使得缓存的使用更加灵活,以满足不同的用例和业务需求——包括以下需求。
NCache CRUD 操作
您可以通过以下方式轻松地将分布式缓存合并到您的 .NET 应用程序中 连接到缓存 并针对从数据库中获取的缓存项创建一个密钥。 然后,您可以在 30 分钟到期后将项目插入缓存,并使用此连接获取它。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// Specify the cache name to connect with it ICache cache = CacheManager.GetCache("demoCache"); // Get product from database var product = FetchProductFromDB(1001); // Generate a key for the cache item string key = "Product:1001"; // Create cache item and add 30sec sliding expiration var cacheItem = new CacheItem(product); cacheItem.Expiration = new Expiration(ExpirationType.Sliding, TimeSpan.FromMinutes(30)); // Now add this item in cache for future use cache.Insert(key, cacheItem); // Fetch item from cache product = cache.Get(key); |
同步C疼痛 数据库
可能存在更改数据库中缓存数据的情况。 这种情况会引发完整性问题,导致您的缓存数据过时,而您的应用程序却没有意识到这一点。 为了解决这个问题, NCache 可以自动将缓存与数据库同步。 因此,每当缓存记录在数据库中发生任何更改时,它将自动从缓存中删除以确保数据新鲜度。
为了进一步协助这一机制, NCache 支持 直写, 加载器和刷新器及 持久存储 使缓存中的数据与数据库保持同步。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// Get orders against customerID from DB var order = FetchOrderByCustomerID("ALFKI"); // Generate unique cache key for the order string key = $"Order:{order.OrderID}"; CacheItem item = new CacheItem(order); // Create SQL query to select the data from database string query = "SELECT CustomerID, Address, City FROM dbo.Customers WHERE CustomerID = 'ALFKI';"; //Specify database connection string and the query to create and set SQLCacheDependency. item.Dependency = new SqlCacheDependency(dbConnString, query); // Insert the item into the cache cache.Insert(key, item); |
SQL 查询
NCache 支持一个 SQL 查询机制,让您根据给定的标准搜索缓存并返回所需的结果集。 NCache 使用非常接近原生 SQL 结构化语言的查询语言,这使得查询索引缓存数据更加容易。 它提供了与 ADO.NET 兼容的 API,例如 执行阅读器, 执行标量及 执行非查询 从缓存中搜索 (SELECT) 和删除 (DELETE) 数据。
NCache 更多信息 SQL 和 LINQ 支持 NCache SQL查询
ExecuteReader 用于搜索数据并返回键值对。 在使用 ExecuteReader 方法时,您可以指定是只希望返回键,还是希望返回键及其数据(作为一个整体或以块的形式)。
1 2 3 4 5 6 7 8 9 10 11 |
//string query = "SELECT * FROM FQN.Product WHERE UnitsInStock > ?"; var queryCommand = new QueryCommand(query); queryCommand.Parameters.Add("UnitsInStock",0); ICacheReader reader = cache.ExecuteReader(queryCommand); while (reader.Read()) { string ID = reader.GetValue("ProductID"); string Name = reader.GetValue("ProductName"); } |
LINQ 查询
LINQ 是一种通用的 .NET 查询语言,允许您从数据源中搜索和过滤数据。 LINQ 语法与 SQL 非常相似,但在功能上,它为您提供了更好、更优化的查询方法。 NCache 服务器。 它提供了允许更高效的查询表达式的能力,同时满足代码编译期间的语法检查。
NCache 通过 LINQ 提供程序无缝集成 LINQ 以查询缓存中的信息。 链接提供程序有助于在分布式缓存上执行 LINQ 查询,同时提高应用程序的性能,而无需更改 LINQ 对象模型。
查询表达式从启用 LINQ 的分布式缓存服务器查询和转换数据。
1 2 3 4 |
IQueryable products = new NCacheQuery(cache); IQueryable product = from prod in products where prod.UnitsInStock > 10 select prod; |
总结思考
除了提供性能和可扩展性之外, NCache 提供 其他有用的功能 也。 然而,它隐藏了与实现相关的复杂性,并提供了一种直接的使用方式。 如果您正在寻找基于 .NET 的分布式缓存,并且不影响性能和可扩展性,那么您可以选择 NCache. 它是一个纯 .NET 平台,具有现代分布式缓存的所有花里胡哨