缓存可伸缩性在路径上的分发

来源:互联网 发布:广州丽晶软件 编辑:程序博客网 时间:2024/03/28 19:42
缓存可伸缩性在路径上的分发
Iqbal Khan

鏈  枃璁 ㄨ :
  • 分发缓存
  • 可伸缩性
  • 数据库同步
本文使用以下技术: 
ASP.NET,Web 的服务 HPC 应用程序 
分发缓存 
在分布式缓存中必须具有的功能 
过期时间 
退出 
缓存数据的关系 
与其他环境中同步高速缓存 
数据库同步 
read-Through 
通过编写,后面写入 
高速缓存查询 
事件传播 
缓存性能和可伸缩性 
高可用性 
性能 
获取受欢迎程度 
如果正在开发的 ASP.NET 应用程序、 Web 服务或高性能计算 (HPC) 应用程序,您可能遇到主要的可伸缩性问题,如您在尝试扩展更多的负载放入您的应用程序。 ASP.NET 应用程序瓶颈发生在两个数据存储区中。 第一个是驻留在数据库,应用程序数据,另通常存储在三种模式之一 (InProc、 会话,或 SqlServer) 提供的对话框中的 ASP.NET 会话状态数据。 所有三个有主要的可伸缩性问题。
Web 服务通常不使用会话状态,但它们执行可伸缩性瓶颈时应用程序数据。 就像 ASP.NET 的应用程序可以 IIS 中托管和可伸缩性网络场中部署 Web 服务。
HPC 应用程序被设计为执行大量并行处理还具有可伸缩性问题,因为数据存储区不会缩放以相同的方式。 HPC (也称为计算网格) 传统上使用了 Java,但作为.NET 收益的市场份额它成为更受欢迎以及 HPC 应用程序。 HPC 应用程序部署到数百个,有时数以千计的计算机的并行处理,它们通常需要大量的数据和共享的中间结果与其他计算机上运行。 HPC 应用程序用作数据库或共享的文件系统在数据存储区和这两种执行不很扩展。

分发缓存
缓存是一个已知的概念,在硬件和软件的世界中。 传统上,缓存已一独立的机制,但的不不再在大多数环境中起作用,因为应用程序现在运行在多个服务器上和在多个进程中每个服务器中。
在内存中的分布式缓存是窗体的缓存允许缓存,以便跨越多个服务器,以便它可以增长的大小和事务的容量。 分布式缓存已变得可行,现在的原因。 首先,内存变得非常低成本,然后您可以在 throwaway 价格内容具有很多 GB 的计算机。 第二个,网卡已变得 10Gbit 攻击 traction 1Gbit 现在标准的任何地方都与非常快。 最后,与数据库服务器,通常要求一高端台计算机的不同分布式缓存可以很容易地添加更多的计算机 (如所使用的 Web 服务器) 的低成本计算机上的很好地工作。
分布式缓存是可伸缩因为它采用了体系结构。 它在多个服务器之间分布工作,但仍然为您提供一个单一的高速缓存的逻辑视图。 应用程序的数据的分布式的缓存在数据库中保存的数据子集的副本。这意味着是小时、 天或周可能意味着一个临时存储。 情况下了大量数据的应用程序中正在使用不需要永久存储。 在 ASP.NET,渚嬪的方式  会话数据是临时的和所需可能几分钟到几个小时的时间最多。
同样,HPC,在大一部分处理需要中间数据存储在一个数据存储区中,这也临时的性质。 HPC 的最终结果可能但是存储在数据库中。 图 1 显示在企业中的典型配置中的分布式缓存。
图 1 在企业中不同的应用程序通过分布式缓存共享 (单击图像可查看大图)

在分布式缓存中必须具有的功能
传统上,开发人员考虑了缓存的只有静态数据,含义永远不会在整个应用程序的生命周期中更改。但该数据通常是一个非常小的子集 — 也许 10%应用程序处理的数据。 尽管您可以保留在缓存中的静态数据,实际值来自如果可以缓存动态或事务性数据保留更改每隔几分钟的数据。 您仍然缓存它因为您可能在的时间范围内获取它数万次,多行程保存到数据库。 如果乘以的数千个用户试图同时执行的操作,您可以假设您具有对数据库的数量较少读取。
但如果缓存动态数据,缓存将为避免数据完整性问题而设计的某些功能。 一个典型的高速缓存应该具有过期,退出,以及其他功能的功能。 我将探讨以下各节中的这些功能。

过期时间
过期时间显示在列表的顶部。 它们允许您指定数据应多长时间保持在高速缓存,缓存会自动删除之前。 您可以指定过期的两种类型: 绝对的时间过期和滑动时间 (或空闲时间) 到期。
如果主数据源中还存在将数据缓存中的,您知道可由用户或应用程序可能不具有访问权限缓存在数据库中更改此数据。 如果出现这种情况在缓存中的,数据已经陈旧。 如果能够估计长此数据可以安全地保留在缓存中您可以指定绝对的时间过期,喜欢的内容,"过期该项从现在起的 10 分钟"或过期该项在今晚午夜。
一个有趣的变体绝对过期是项的您的缓存是否可以重新加载缓存直接从数据源的更新的副本。 这是只有您缓存提供了一个 read-through 功能 (请参阅后面各节) 并允许您注册的绝对过期时重新加载缓存的项 read-through 处理程序。 除了为几个商业缓存,大多数缓存不支持此功能。
可以使用空闲时间 (弹性时间) 过期如果它不用于给定一段时间内过期的项目。 如果没有人读取或更新它的 10 分钟,可以指定等"过期此项目。 这种方法是很有用的您的应用程序将暂时,需要该数据时 (但应用程序完成后使用,您希望自动过期其缓存。 ASP.NET 会话状态很适合的空闲时间过期。
绝对的时间过期可帮助您避免的高速缓存有一个陈旧数据的副本或早于数据库中,主控副本的副本的情况。 空闲时间过期旨在清除缓存后您的应用程序不再需要某些数据。 而不是应用程序跟踪的必要的清理,您可以让负责它的缓存。

退出
大多数分布式的缓存内存中,执行不保留缓存到磁盘。 这意味着在大多数情况下,内存受到限制,高速缓存的大小不能超过一个特定限制,可能是可用的内存总量增加或少得多,如果不在同一台计算机上运行的其他应用程序。
无论使用哪种方式,分布式的缓存应允许您指定最大缓存大小 (理想情况下,方面的内存大小)。缓存达到此大小时,它应开始移除缓存的项的新进程通常称为逐出内容留出空间。
逐出内容在各种算法上进行基于。 最受欢迎的是最小最近使用的 (LRU 少) 位置移除这些缓存的项有不被涉及的闲置时间最长的。 另一种算法是最常用 (LFU)。 此处,已的那些项目涉及最少的次数将被删除。 有几个其他变化但这两个是最常用的。

缓存数据的关系
大多数的数据来自一个关系数据库,但即使它没有关系中,这意味着与另一个相关数据的不同部分 — 渚嬪的方式  客户对象和订单对象。
当这些关系,您需要在缓存中处理它们。 这意味着缓存应该了解有关客户和订单之间的关系。 如果您更新,或从缓存中删除客户,您可能希望缓存也会自动更新,或删除缓存的对象相关的订单。 这有助于保持数据完整性,在许多情况下。
但如果高速缓存不能跟踪这些关系,再次,必须执行其,并更麻烦和复杂,这使您的应用程序。 将更容易很多如果您只需告诉时间数据缓存被添加的订单与客户,关联然后缓存知道是否更新或删除客户,相关的订单也需要更新或从缓存中移除。
ASP.NET 缓存有一个酷的功能,称为 CacheDependency,允许您跟踪的其他缓存项之间的关系。 某些专业缓存也有此功能。 图 2 显示了 ASP.NET 缓存的工作方式的示例。
using System.Web.Caching;...public void CreateKeyDependency(){   Cache["key1"] = "Value 1";    // Make key2 dependent on key1.   String[] dependencyKey = new String[1];   dependencyKey[0] = "key1";   CacheDependency dep1 = new CacheDependency(null, dependencyKey);   Cache.Insert("key2", "Value 2", dep2);}
这是一个多层的依赖项,A 可以依赖 B 和 B 的意义可以依赖于 C。 因此如果您的应用程序中删除 C A 和 B 必须从以及缓存中移除。

与其他环境中同步高速缓存
过期时间和缓存依赖项功能旨在帮助您保持最新和正确的缓存。 您还需要与您和您的高速缓存没有访问权限,以便这些数据源中的更改将反映在您使其保持最新的缓存的数据源同步,您的缓存。
渚嬪的方式  假设使用 Microsoft.NET 写入高速缓存,但 Java 或 C + + 应用程序修改主数据源中的数据。 您希望这些应用程序时要通知您缓存某些数据更改主数据源中,以便您的缓存可以使相应的缓存的项无效。
理想情况下,您缓存应该支持此功能。 如果不是,此负担内您的应用程序。 ASP.NET 缓存提供此功能通过 CacheDependency,执行某些商业缓存解决方案。 它允许您指定某些缓存的项取决于文件和每次时更新和删除该文件缓存发现这并且使缓存的项无效。 使应用程序以获取此对象的最新副本下一次您的应用程序在项强制无效需要它,并且找不到它在缓存中。
如果您在缓存中有 100,000 项,10,000 个鏂囦欢鐩稿叧鎬 э 并且的您可能有 10,000 个文件的一个特殊的文件夹。 每个文件具有特殊名称与该缓存项相关联。 时其他应用程序是否编写.NET 中,或不 — — 更改应用程序可以进行通信到缓存文件时间戳的更新通过主数据源中数据。

数据库同步
数据库同步需要出现,因为数据库由正在共享个多的应用程序并不是所有这些应用程序有权访问您的缓存。 如果您的应用程序只更新数据库的应用程序,它可以方便地更新缓存,您可能不需要的数据库同步功能。 但在一个真实的环境中这并不总是这种情况。 第三方或任何其他应用程序更改数据库数据时, 要缓存以反映所做的更改。 缓存重新加载在的数据或在更改反映了至少通过不将旧数据在缓存中。
如果高速缓存有一个新的副本的旧副本和数据库,您现在有了数据完整性问题,因为您不知道的副本是右。 当然,数据库总是右,但不总是转到该数据库。 因为您的应用程序信任缓存将始终可以正确,否则缓存将足够适合其需要,可以从缓存获取数据。
与数据库同步可能意味着作废在缓存中的相关的项,以便在下次您的应用程序需要它将它从数据库获取。 缓存自动重新加载该对象的更新的副本数据库中数据的数据更改时,此过程的一个有趣变量。但是,这是只有您缓存允许您提供一个 read-through 处理程序 (请参阅下一节),然后重新加载缓存的项从数据库中使用它。 然而,在商业高速缓存的某些支持此功能,并且没有任何可用的。
ASP.NET 缓存具有 SqlCacheDependency 功能 (请参见 图 3 ),可以与进行同步缓存 2008 年 SQL Server 2005 日 Oracle 10 g R2 或更高版本的数据库基本上具有内置.NET CLR 的任何数据库。 在商业高速缓存的部分还提供了此功能。
using System.Web.Caching;using System.Data.SqlClient;...public void CreateSqlDependency(Customers cust, SqlConnection conn){  // Make cust dependent on a corresponding row in the  // Customers table in Northwind database  string sql = "SELECT CustomerID FROM Customers WHERE ";  sql += "CustomerID = @ID";  SqlCommand cmd = new SqlCommand(sql, conn);  cmd.Parameters.Add("@ID", System.Data.SqlDbType.VarChar);  cmd.Parameters["@ID"].Value = cust.CustomerID;  SqlCacheDependency dep = new SqlCacheDependency(cmd);  string key = "Customers:CustomerID:" + cust.CustomerID;  Cache.Insert(key, cust, dep);}
ASP.NET 缓存 SqlCacheDependency 允许您指定一个以匹配数据库中表中的一个或多个行的 SQL 字符串。 如果曾经更新该行,则 DBMS 将触发一个.NET 事件捕获缓存。 它然后知道的缓存的项目与数据库中的此行相关,并使该缓存的项的无效。
ASP.NET 缓存不提供,但某些商业解决方案执行的一个功能是基于轮询数据库同步。 此功能非常有用的两种情况下。 第一次,DBMS 不具有内置.NET CLR,如果您不能受益于 SqlCacheDependency。 在这种情况下会好如果高速缓存可以上可配置的时间间隔轮询数据库并检测到表中的某些行中的更改。 如果更改了这些行,您缓存无效及其相应的缓存的项。
数据库中的数据经常更改,并且.NET 事件变得太吵闹时,第二个的情况。 这是因为一个单独的.NET 事件触发,每个 SqlCacheDependency 更改,如果上千个经常更新的行这可以很容易地 crowd 高速缓存。 在这样的情况下是依赖于轮询,效率更高位置使用一个数据库查询就可以获取数百或数千个已更改,然后使相应的缓存的项的行。 当然,轮询中同步 (也许 15–30 秒) 创建稍稍有些延迟,但这是在许多情况下可以接受的。

read-Through
read-through 是一种允许您直接从您的数据源中读取数据的缓存功能的一个简单地说任何可能。 您编写 read-through 处理程序注册您的缓存和缓存然后在适当的时间调用此处理程序。 图 4 显示了一个示例。
using System.Web.Caching;using System.Data.SqlClient;using Company.MyDistributedCache;...public class SqlReadThruProvider : IReadhThruProvider{  private SqlConnection _connection;  // Called upon startup to initialize connection  public void Start(IDictionary parameters)  {    _connection = new SqlConnection(parameters["connstring"]);    _connection.Open();  }  // Called at the end to close connection  public void Stop() { _connection.Close(); }  // Responsible for loading object from external data source  public object Load(string key, ref CacheDependency dep)  {    string sql = "SELECT * FROM Customers WHERE ";    sql += "CustomerID = @ID";    SqlCommand cmd = new SqlCommand(sql, _connection);    cmd.Parameters.Add("@ID", System.Data.SqlDbType.VarChar);    // Let's extract actual customerID from "key"    int keyFormatLen = "Customers:CustomerID:".Length;    string custId = key.Substring(keyFormatLen,    key.Length - keyFormatLen);    cmd.Parameters["@ID"].Value = custId;    // fetch the row in the table    SqlDataReader reader = cmd.ExecuteReader();    // copy data from "reader" to "cust" object    Customers cust = new Customers();    FillCustomers(reader, cust);    // specify a SqlCacheDependency for this object    dep = new SqlCacheDependency(cmd);    return cust;  }}
外部应用程序通常位于分布式的缓存,因为它被共享在您的应用程序的多个实例或即使多个应用程序。 read-through 处理程序的一个重要的功能是您缓存的数据是由缓存直接从数据库提取。 因此,您的应用程序不必具有数据库的代码。 它们只是可以从缓存,获取数据并如果高速缓存没有它,缓存转将其从数据库。
您可以获得更重要的优点,如果 read-through 功能结合过期。 只要缓存中的项过期,高速缓存会自动重新它加载通过调用 read-through 处理程序中。 使用此机制将大量的通信保存到数据库。 缓存用于只有一个线程,一个数据库行程,重新装载的数据,从该的数据库,而您可能需要数千个用户试图访问该相同的数据。 如果您没有 read-through 功能,所有这些用户将会将直接数据库,inundating 数据库有上千个并行的请求。
read-through 使您可以建立不意味着不只是高度可缩放,但可以同时刷新从主数据源的数据存储区下的企业级的数据网格。 这提供与其他数据源应用程序要从中读取数据,并免除大量的数据库上的压力。
正如前面提到数据库始终是瓶颈在盘高-交易记录的环境中,并且它们成为瓶颈,因为通常为过多的读取操作,还降低鍐欏叆鎿嶄綔。 有一个充当数据库上面的企业级的数据网格可将您的应用程序主要性能和可伸缩性提高的高速缓存。
但是,请注意该 read-through 不在数据库中执行一些复杂联接的查询的替代。 一个典型的高速缓存中不允许您执行这些类型的查询。 用于读取操作的单个对象,但不是涉及复杂的联接的查询,始终需要在数据库上执行的操作的工作方式 read-through 功能。

通过编写,后面写入
写入是 read-through 一样: 您提供一个处理程序,并缓存调用该处理程序在更新缓存时将数据写入数据库。 主要优点之一是您的应用程序不能直接写入数据库因为缓存它为您。 这简化了应用程序代码,因为缓存,而不是您的应用程序数据访问代码。
正常情况下,您的应用程序发出缓存 (渚嬪的方式  添加、 插入或删除) 的更新。 缓存第一次更新本身,然后颁发在数据库中写入处理程序通过一个更新调用。 您的应用程序一直等到,则更新都缓存和数据库。
如果您想要等待更新,缓存,但您不想等待要更新的速度减慢您的应用程序的性能,因为该数据库吗? 这写隐藏引入的、 其使用相同的处理写入程序,但同步更新缓存和数据库以异步方式。 这意味着您的应用程序等待缓存更新,但您不等待数据库以进行更新。
您就知道的数据库更新排队等候,缓存非常快速地更新数据库。 这是另一个方法,以提高您的应用程序性能。 您必须仍,写入数据库,但为什么等待? 如果缓存中有数据不要甚至会降低您的应用程序不查找数据库中数据,因为您只需更新缓存,并且您的应用程序的其他实例将在缓存中查找数据中,不需要转到数据库的其他实例的后果。

高速缓存查询
在正常情况下,您的应用程序对象缓存中找到一个密钥,就像一个哈希表正如您所看到的上面源的代码示例中。 密钥,而且值是您的对象。 但有时您需要搜索基于属性而不是键的对象。 因此,您缓存需要提供了该功能可以搜索或查询缓存。
有两种方法可以执行此操作。 一个是搜索该对象的属性。 其他涉及到的情况下,在您已指定给缓存对象的任意标记,并要搜索基于这些标记。 基于属性的搜索是仅在对象的查询语言通过某些商业解决方案中当前可用但基于标记的搜索可用在商业高速缓存和 Microsoft 速度中。
假设您保存了一个客户的对象。 您可以说,"授予我所有客户所在的城市所在旧金山,"即使您缓存有员工、 客户、 订单、 项目排序和多个需要只有客户的对象。 当您发出一个类似于 SQL 的查询,如 图 5 所示时,它查找与条件匹配的对象。
using Company.MyDistributedCache;...public List<Customers> FindCustomersByCity(Cache cache, string city){  // Search cache with a LINQ query  List<Customers> custs = from cust in cache.Customers                          where cust.City == city                          select cust;  return custs;}
标记可以将多个任意标记附加到特定的对象,相同的标记可以与多个对象相关联。 标记是通常基于字符串的并且标记允许您对对象分组进行分类和然后查找以后,通过这些标记或一组对象。

事件传播
您可能不总是需要事件传播在您的缓存但您应该了解的有关的一个重要功能。 它是一个很好的功能,如果您具有分发应用程序、 HPC 的应用程序或多个应用程序共享通过缓存的数据。 哪些事件传播不会是要求以激发事件时某些事情发生在缓存中缓存。 您的应用程序可以捕获这些事件,并采取相应的操作。
假设您的应用程序已从缓存中提取一些对象,并且向用户显示。 您可能想知道如果任何人都更新,或从缓存移除此对象,它显示时。 在本例中,您的应用程序将会收到通知,并且您可以更新用户界面。
这是,当然,是一个非常简单的示例。 在其他情况下,您可能在您的应用程序的某些情况下生成数据,其他实例需要使用分布式应用程序。 在发生器可以通知使用者数据时触发通过缓存的使用者接收事件的准备。 有许多示例这种类型的协作或共享通过缓存的数据可以实现通过事件传播。

缓存性能和可伸缩性
当考虑上一节中所述,缓存功能,您必须不忘记主原因您的使用以提高性能的一个分布式的缓存 thinking 和,以提高您的应用程序的可伸缩性更重要。 此外,在作为服务器生产环境中运行您的缓存,因为它还必须提供高可用性。
可伸缩性是一个分布式的缓存地址基本问题。 一个可伸缩的高速缓存是即使您增加事务负载在其上的时,也可以保持性能。 因此,如果您有一个网络场中的 ASP.NET 应用程序您增长到 15 或甚至是 50 的 Web 服务器从五个 Web 服务器 Web 群,您应能够按比例增长的高速缓存服务器的数目,并保留相同的响应时间。 这是不与数据库的内容。
分布式的缓存可避免数据库通常是因为它是简单的性质 DBMS 比面临可伸缩性问题,还因为它使用不同的存储机制 (也称为缓存拓扑) 比一个 DBMS。 这些包括复制、 分区,和客户端缓存拓扑。
在大多数分布式有关缓存的情况下有两个或多台缓存服务器承载该缓存。 我将使用术语"缓存群集"以指示两个或多个缓存服务器连接在一起到窗体的一个逻辑缓存。 复制高速缓存中缓存群集复制整个缓存每个缓存的服务器上。 这意味着一个已复制的缓存提供高可用性。 如果任何一个高速缓存服务器停机您不会丢失缓存中的任何数据,因为另一个副本是应用程序立即可用。 它也是一个非常有效的拓扑结构,并提供很好的可伸缩性,如果您的应用程序需要做大量的读取密集型操作。 当您添加更多的缓存服务器,要添加的更多的读取事务容量缓存群集。 但一个复制的高速缓存不是理想拓扑结构的写密集型操作。 如果经常所阅读您正在更新缓存不需使用复制拓扑结构。
一个分区的高速缓存中断设置缓存到分区并将存储一个分区在群集中每个缓存服务器上。 此拓扑是最可伸缩的事务处理数据缓存 (为频繁读取与写入缓存时)。 向群集中添加更多的缓存服务器,增加事务容量不仅存储容量的缓存,因为所有这些分区一起构成了整个缓存。
许多分布式的缓存提供一个分区的高速缓存的变体。 其中每个分区还可复制这样的一个缓存服务器包含一个分区和副本或另一台服务器的分区的备份的高可用性 这种方式,您不会丢失任何数据如果任何一个服务器出现故障。 一些缓存解决方案允许您创建的每个分区添加的可靠性的多个副本。
另一种非常强大的缓存拓扑是非常有用,如果您的缓存驻留在远程专用缓存层客户端缓存 (也称为附近缓存)。 客户端缓存思想是每个客户端都将保存工作一缓存关闭的 (甚至在应用程序的过程) 在客户端计算机上。 但是,就像一个分布式的缓存已与在数据库中不同的方法 (如前面讨论) 通过被同步,客户端缓存需要分布式缓存与进行同步。 某些专业的缓存解决方案提供这种同步机制,但最提供仅独立客户端缓存没有任何同步。
相同的方式分布式的缓存减少数据库通信,客户端缓存到分布式缓存减少通信量。 它不是只快分布式缓存因为它更接近应用程序 (并且也可以是 InProc),通过减少到分布式缓存的行程还改进了分布式缓存的可伸缩性,它。 当然,客户端缓存是一个好的方法,这是仅当您执行的许多比写入更多的读取时。 相等的读取和写入的数目时不要使用客户端缓存。 写入将变为较慢的因为现在,您必须更新客户端高速缓存和分布式的缓存。

高可用性
在您的生产环境中和在许多情况下在服务器作为应用程序 (渚嬪的方式  ASP.NET 会话状态) 的唯一数据存储区运行分布式的缓存,因为缓存必须提供高可用性。 这意味着您缓存必须非常稳定,以便它永远不会崩溃,并能够在不停止缓存的情况下进行配置更改。
分布式缓存的大多数用户需要缓存,以便不使用任何中断的情况下个月一次运行。 只要他们不得不停止缓存,它是通常在向下的计划时间内。 这就是高可用性至关重要这样的分布式缓存的原因。 以下是要评估是否缓存解决方案提供高可用性时,请记住几个问题。
  • 可以将其中的一个缓存服务器向下不停止整个缓存的情况下吗?
  • 您可以添加新的缓存服务器没有停止缓存吗?
  • 您可以添加新客户端没有停止缓存吗?
在大多数缓存,您将使用指定的最大缓存大小,以便在高速缓存不能超过的数据量。 基于高速缓存的大小是多少内存具有上可用的系统上。 您可以更改该容量吗? 让我们假定您最初设置为 1 GB 的缓存大小,但现在希望它 2 GB。 您能做的不停止缓存吗?
这些是您要考虑的问题的类型。 这些配置更改的真正需要的缓存,以便重新启动? 在少,越好。 缓存功能,以外的其他具有高速缓存可以运行在生产环境中的第一个条件是高速缓存将为您提供多少正常运行时间。

性能
只需放,如果访问缓存不快访问您的数据库,则它不需要。 具有说,应预期在从一个很好的分布式缓存性能方面?
首先要记住是分布式的缓存通常 OutProc 或远程,因此访问时间永远不会将独立 InProc 缓存 (渚嬪的方式  ASP.NET 缓存) 的一样快。 在 InProc 独立缓存中,可能可以读取 150,000 到 200,000 秒 (1 KB 对象大小) 的项目。 与一个 OutProc 或远程缓存,此数字显著下降。 性能,方面的预想 (从命中在其上的所有客户端) 的单个缓存服务器的吞吐量为 30,大约 20,000 到 000 读取每秒 (1 KB 对象大小)。 您可以通过使用客户端缓存 (InProc 模式) 中的实现此 InProc 性能的一些但只读取操作和不写操作。 您为了获得可伸缩性,牺牲一些性能,但仍然得快数据库访问速度较慢的性能。

获取受欢迎程度
分布式的缓存作为一个概念和最佳做法获得更多的普及。 只在几年前,.NET 空间很少人员知道它,虽然 Java 社区已超前于此区域中的.NET。 在应用程序事务中启增长,数据库压力超出其限制,并分布式缓存现在接受任何可伸缩的应用程序体系结构的一部分重要。

Iqbal Khan 总裁并且在技术 evangelist Alachisoft . Alachisoft 提供 NCache、 的业界领先的.NET 分布式缓存提升性能和可伸缩性在企业应用程序中。 Iqbal Bloomington 印地安那州澶 у  从计算机科学中有一个 MS。 您可以与他在 iqbal@alachisoft.com .

原创粉丝点击