云计算设计模式(一)——缓存预留模式

云计算设计模式(一)——缓存预留模式

根据需求从数据存储缓存加载数据。这种模式可以提高性能,并有助于维持在基础数据存储在高速缓存中保持的数据和数据之间的一致性。

背景和问题

应用程序使用的高速缓存来优化重复访问的数据存储中保持的信息。然而,它通常是不切实际的期望缓存的数据将始终与在数据存储器中的数据完全一致。应用程序要实现一种策略,有助于确保在高速缓存中的数据是最新的,只要有可能,但也可以检测和处理的过程中出现,当在高速缓存中的数据已经变得陈旧的情况。

解决方案

许多商业缓存系统提供通读和直写式/后写操作。在这些系统中,应用程序通过引用高速缓存中检索数据。如果数据不在缓存中,它被透明地从数据存储中检索并添加到高速缓存。任何修改在高速缓存中保持的数据被自动地写入到数据存储区以及。

为缓存不提供此功能,则使用该缓存保持在高速缓存中的数据的应用程序的责任。

一个应用程序可以通过实现高速缓存预留战略模拟的读式高速缓存的功能。这种策略有效地将数据加载需求的高速缓存。图1总结了在该过程中的步骤。

图1  - 使用Cache-除了图案来将数据存储在高速缓冲存储器

如果一个应用程序将更新的信息,它可以模拟通写策略如下:

1.根据修改到数据存储

2.作废对应的项在缓存中。

当该项目被下一个需要,可使用高速缓存预留策略将导致从数据存储中检索和重新添加到高速缓存中的更新数据。

问题和注意事项

在决定如何实现这个模式时,请考虑以下几点:

?缓存数据的生命周期。很多缓存实现一个过期策略,导致数据无效,并从缓存中移除如果它不是在指定时间内访问。对于缓存一边是有效的,确保了过期策略相匹配的访问用于使用数据的应用程序的模式。不要使有效期限太短,因为这会导致应用程序不断地从数据存储中检索数据,并将其添加到缓存中。同样,不要使保质期这么久,缓存的数据很可能会变得陈旧。记住,缓存是最有效的相对静态的数据,或者数据被频繁地读出。

?驱逐数据。最高速缓存具有比从其中数据源自数据存储区只有有限的大小,并在必要时它们将收回的数据。大多数缓存采用最近最少使用的政策选择项目驱逐,但是这可能是定制的。配置全局到期属性和高速缓存的其它性能,并且每个高速缓存项的到期属性,以帮助确保缓存成本效益。它可能并不总是适合于高速缓存中的应用全球驱逐政策,每一个项目。例如,如果缓存项是非常昂贵的,从数据存储中检索,也可能是有益的,保留在更频繁地访问但不昂贵的物品的费用此产品的高速缓存中。

?灌注缓存。许多解决方案,预填充用的应用程序可能需要作为启动处理的一部分的数据的高速缓存。如果某些数据已到期,被驱逐的缓存,除了图案可能仍然是有用的。

?一致性。执行缓存除了图案不保证数据存储和高速缓存之间的一致性。在数据存储中的项目可以在任何时候被改变由外部的过程中,这种变化可能不反映在高速缓存中的项目被装载到高速缓存,直到下一次。在一个系统,整个数据存储复制数据,如果同步发生非常频繁这个问题可能会变得尤为突出。

?本地(内存)缓存。缓存可以是本地的应用程序实例,并存储在内存中。缓存预留如果应用程序多次访问相同的数据可以在该环境中是有用的。然而,本地高速缓存是私有的,因此不同的应用程序实例可各自具有相同的缓存数据的副本。此数据可能很快变成高速缓存之间不一致,所以它可能有必要在到期专用高速缓存中保存的数据和更经常地刷新。在这些场景中它可能是适当的,调查使用了共享或分布式缓存机制。

当使用这个模式

使用这种模式时:

?缓存不提供原生读通过,并通过写操作。

?资源的需求是不可预测的。这种模式使应用程序能够按需加载数据。它使任何假设有关的数据的应用程序将需要提前。

这种模式可能不适合:

?当缓存的数据集是静态的。如果数据将适合可用的高速缓存空间,首要的高速缓存中的数据在启动和应用,防止数据从止政策。

?对于托管在Web场中的Web应用程序缓存会话状态信息。在这种环境下,你应该避免引入基于客户端 -
服务器关系的依赖。

例子

在微软的Azure,您可以使用Azure的缓存来创建一个分布式缓存,可以通过一个应用程序的多个实例可以共享。下面的代码示例中的GetMyEntityAsync方法给出了基于Azure的缓存Cache后备模式的实现。此方法从利用读虽然方法缓存中的对象。

一个目的是确定用一个整数ID作为键。该GetMyEntityAsync方法生成基于此键(在Azure缓存API使用的键值字符串)的字符串值,并尝试检索与从缓存中这一关键的项目。如果匹配的项目被发现,它被返回。如果在缓存中没有匹配,则GetMyEntityAsync方法从一个数据存储中的对象时,把它添加到缓存中,然后将其返回(即实际上获得从数据存储中的数据的代码已经被省略,因为它是数据存储依赖)。注意,缓存项被配置以防止其成为陈旧如果是在别处更新过期。

private DataCache cache;
...

public async Task<MyEntity> GetMyEntityAsync(int id)
{
  // Define a unique key for this method and its parameters.
  var key = string.Format("StoreWithCache_GetAsync_{0}", id);
  var expiration = TimeSpan.FromMinutes(3);
  bool cacheException = false;

  try
  {
    // Try to get the entity from the cache.
    var cacheItem = cache.GetCacheItem(key);
    if (cacheItem != null)
    {
      return cacheItem.Value as MyEntity;
    }
  }
  catch (DataCacheException)
  {
    // If there is a cache related issue, raise an exception
    // and avoid using the cache for the rest of the call.
    cacheException = true;
  }

  // If there is a cache miss, get the entity from the original store and cache it.
  // Code has been omitted because it is data store dependent.
  var entity = ...;

  if (!cacheException)
  {
    try
    {
      // Avoid caching a null value.
      if (entity != null)
      {
        // Put the item in the cache with a custom expiration time that
        // depends on how critical it might be to have stale data.
        cache.Put(key, entity, timeout: expiration);
      }
    }
    catch (DataCacheException)
    {
      // If there is a cache related issue, ignore it
      // and just return the entity.
    }
  }

  return entity;
}

注意:

该示例使用了Azure的缓存API来访问存储和检索的缓存信息。有关Azure的缓存API的更多信息,请参阅MSDN上使用微软的Azure缓存。

下面所示的UpdateEntityAsync方法说明如何在高速缓存中的对象无效,当该值是由应用程序改变。这是一个写通方法的实例。该代码更新原始数据存储,然后通过调用Remove方法,指定键(这部分功能的代码已经被省略了,因为这将是数据存储相关)从缓存中删除缓存项。

注意:

在这个序列中的步骤的次序是重要的。如果之前的缓存更新的项被删除,对于客户端应用程序中的数据存储中的项目之前获取的数据(因为它没有在高速缓存中发现的)的机会已经改变一个小窗口,从而在缓存包含过期数据。

public async Task UpdateEntityAsync(MyEntity entity)
{
  // Update the object in the original data store
  await this.store.UpdateEntityAsync(entity).ConfigureAwait(false);

  // Get the correct key for the cached object.
  var key = this.GetAsyncCacheKey(entity.Id);

  // Then, invalidate the current cache object
  this.cache.Remove(key);
}

private string GetAsyncCacheKey(int objectId)
{
  return string.Format("StoreWithCache_GetAsync_{0}", objectId);
}

本文翻译自MSDN:http://msdn.microsoft.com/en-us/library/dn589799.aspx

时间: 2024-11-06 09:53:19

云计算设计模式(一)——缓存预留模式的相关文章

云计算设计模式系列文章

云计算设计模式(一)——缓存预留模式 云计算设计模式(二)——断路器模式 云计算设计模式(三)——补偿交易模式 云计算设计模式(四)——消费者的竞争模式 云计算设计模式(五)——计算资源整合模式 云计算设计模式(六)——命令和查询职责分离(CQRS)模式 云计算设计模式(七)——事件获取模式 云计算设计模式(八)——外部配置存储模式 云计算设计模式(九)——联合身份模式 云计算设计模式(十)——守门员模式 云计算设计模式(十一)——健康端点监控模式 云计算设计模式(十二)——索引表模式 云计算设

云计算设计模式(十九)——运行重构模式

云计算设计模式(十九)——运行重构模式 设计应用程序,使得它可以在不需要重新部署或者重新启动应用程序重新配置.这有助于保持可用性并减少停机时间. 背景和问题 一个主要目的为重要的应用,如商业和企业网站是尽量减少停机时间以及由此引发的中断给客户和用户.但是,有时有必要重新配置应用程序改变特定行为或设置,而在部署和使用.因此,它是用于该应用程序被设计成这样一种方式,以允许在运行时要应用这些配置的变化,并为应用程序,以检测所述变化并且尽快地应用它们的部件的优点. 该种要应用可能被调整记录,以协助与应用

云计算设计模式(二十三)——Throttling节流模式

云计算设计模式(二十三)——Throttling节流模式 控制由应用程序使用,一个单独的租户或整个服务的一个实例的资源的消耗.这种模式可以允许系统继续运行并满足服务水平协议,即使当增加需求的资源放置一个极端载荷. 背景和问题 在云应用负载通常上变化的基础上的活动用户的数量或他们正在执行的活动类型的时间.例如,多个用户可能会在工作时间被激活,否则系统可能被要求在每月结束时执行计算昂贵的分析.也有可能是突然和意外的突发活动.如果系统的处理要求超过了可用的资源的能力,其将遭受性能不佳,甚至会失败.该系

云计算设计模式(十四)——实体化视图模式

云计算设计模式(十四)——实体化视图模式 产生过在一个或多个数据存储中的数据预填充的观点时,数据被格式化以不利于所需的查询操作的一种方式.这种模式可以帮助支持高效的查询和提取数据,并提高应用程序的性能. 背景和问题 何时存储数据时,优先级为开发者和数据管理员经常集中在如何将数据存储,而不是它是如何读出.所选择的存储格式通常是密切相关的数据,用于管理数据的大小和数据的完整性,并且在使用的那种存储的要求的格式.例如,使用的NoSQL文献商店时,该数据通常被表示为一系列的聚集体,其每一个包含了所有的信

云计算设计模式(七)——事件获取模式

云计算设计模式(七)--事件获取模式 使用仅追加存储到记录完整一系列描述在一个域上取数据,而不是存储仅仅是当前的状态,从而使存储区可以被用来实现该域对象的动作事件.该图案可以通过避免需要同步的数据模型和商业领域中简化复杂的结构域的任务;提高性能,可扩展性和响应能力;提供交易数据的一致性;并保持完整的审计跟踪和记录,可能使补偿措施. 背景和问题 大多数应用程序使用数据,并在典型的方法是应用到通过更新它作为用户使用的数据保持数据的当前状态.例如,在传统的创建,读取,更新和删除(CRUD)模型的典型数

云计算设计模式(六)——命令和查询职责分离(CQRS)模式

云计算设计模式(六)--命令和查询职责分离(CQRS)模式 隔离,通过使用不同的接口,从操作读取数据更新数据的操作.这种模式可以最大限度地提高性能,可扩展性和安全性;支持系统在通过较高的灵活性,时间的演变;防止更新命令,从造成合并在域级别上的冲突. 背景和问题 在传统的数据管理系统中,这两个命令(更新数据)和查询(请求数据),针对在一个单一的数据存储库中的相同的一组实体的执行.这些实体可以是在关系数据库中的一个或多个表,如SQL Server的行的子集. 典型地,在这些系统中,所有的创建,读取,

云计算设计模式(十九)——执行重构模式

云计算设计模式(十九)--执行重构模式 设计应用程序,使得它能够在不须要又一次部署或者又一次启动应用程序又一次配置.这有助于保持可用性并降低停机时间. 背景和问题 一个主要目的为重要的应用.如商业和企业站点是尽量降低停机时间以及由此引发的中断给客户和用户. 可是.有时有必要又一次配置应用程序改变特定行为或设置,而在部署和使用.因此,它是用于该应用程序被设计成这样一种方式,以同意在执行时要应用这些配置的变化,并为应用程序.以检測所述变化而且尽快地应用它们的部件的长处. 该种要应用可能被调整记录,以

云计算设计模式(二)——断路器模式

云计算设计模式(二)--断路器模式 处理故障连接到远程服务或资源时,可能需要耗费大量的时间.这种模式可以提高应用程序的稳定性和灵活性. 背景和问题 在分布式环境中,如在云,其中,应用程序执行访问远程资源和服务的操作,有可能对这些操作的失败是由于瞬时故障,如慢的网络连接,超时,或者被过度使用的资源或暂时不可用.这些故障一般之后的短时间内纠正自己,和一个强大的云应用应该准备使用的策略来处理它们,例如,通过重试模式进行说明. 但是,也可以是其中的故障是由于那些不容易预见的突发事件的情况下,这可能需要更

云计算设计模式(八)——外部配置存储模式

云计算设计模式(八)--外部配置存储模式 移动配置信息从应用部署包到一个集中位置.这个模式可以提供机会,以便管理和配置数据的控制,以及用于跨应用程序和应用程序实例共享的配置数据. 背景和问题 大多数应用程序运行时环境包括位于应用程序文件夹内的在部署应用程序文件保持配置信息.在某些情况下也能够编辑这些文件来改变该应用程序的行为,它已经被部署之后.然而,在许多情况下,改变配置所需要的应用程序被重新部署,从而导致不可接受的停机时间和额外的管理开销. 本地配置文件还配置限制为单个应用程序,而在某些情况下