云带来的改变是显而易见的,云计算是一种按使用量付费的模式,这种模式提供可用的、便捷的、按需的网络访问, 进入可配置的计算资源共享池(资源包括网络,服务器,存储,应用软件,服务),这些资源能够被快速提供,只需投入很少的管理工作,或与服务供应商进行很少的交互。本系列包括 24 种云计算设计模式,能够让读者学习如何设计高可用性、高弹性、低运维、可监控与自动化的云计算平台

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

背景和问题

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

解决方案

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

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

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

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

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

  • 根据修改到数据存储

  • 作废对应的项在缓存中。

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

问题和注意事项

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

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

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

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

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

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

当使用这个模式

使用这种模式时:

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

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

这种模式可能不适合:

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

  • 对于托管在 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);
} 
原文地址:http://blog.csdn.net/yangzhenping/article/details/40785475

.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

云计算设计模式(一)缓存预留模式相关推荐

  1. 云计算设计模式(五)——计算资源整合模式

    合并多个任务或操作成一个单一的计算单元.这种模式可以提高计算资源的利用率,并降低与云托管的应用程序进行计算处理相关的成本和管理开销. 背景和问题 云应用程序频繁执行各种操作.在某些解决方案也可能是有意 ...

  2. 云计算设计模式(四)——消费者的竞争模式

    允许多个并发用户处理在同一个通讯通道接收的消息.这种模式使系统能够同时处理多个邮件,以优化吞吐量,提高可扩展性和可用性,以及平衡工作负载. 背景和问题 在云中运行的应用程序,可以预计,以处理大量的请求 ...

  3. 云计算设计模式(三)——补偿交易模式

    撤消由一系列步骤,它们共同限定了最终一致性操作中,如果一个或多个步骤失败执行的工作.按照最终一致性模型,业务实现复杂的业务流程和工作流的云托管的应用程序中很常见. 背景和问题 在云中运行的应用程序频繁 ...

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

    云带来的改变是显而易见的,云计算是一种按使用量付费的模式,这种模式提供可用的.便捷的.按需的网络访问, 进入可配置的计算资源共享池(资源包括网络,服务器,存储,应用软件,服务),这些资源能够被快速提供 ...

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

    云计算设计模式(二十三)--Throttling节流模式 控制由应用程序使用,一个单独的租户或整个服务的一个实例的资源的消耗.这样的模式能够同意系统继续执行并满足服务水平协议.即使当添加需求的资源放置 ...

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

    云计算设计模式(六)--命令和查询职责分离(CQRS)模式 隔离,通过使用不同的接口,从操作读取数据更新数据的操作.这种模式可以最大限度地提高性能,可扩展性和安全性;支持系统在通过较高的灵活性,时间的 ...

  7. 云计算设计模式(十)——守门员模式

    云计算设计模式(十)--守门员模式 通过使用充当客户端和应用程序或服务之间的代理,验证和进行消毒的请求,并将它们之间的请求和数据的专用主机实例保护的应用程序和服务.这可以提供一个额外的安全层,并限制了 ...

  8. 云计算设计模式(二十四)——仆人键模式

    云计算设计模式(二十四)--仆人键模式 使用一个令牌或密钥,向客户提供受限制的直接訪问特定的资源或服务,以便由应用程序代码卸载数据传输操作. 这个模式是在使用云托管的存储系统或队列的应用中特别实用,而 ...

  9. 云计算设计模式(十五)——管道和过滤器模式

    云计算设计模式(十五)--管道和过滤器模式 分解,执行复杂处理成一系列可重复使用分立元件的一个任务.这种模式可以允许执行的处理进行部署和独立缩放任务元素提高性能,可扩展性和可重用性. 背景和问题 一个 ...

最新文章

  1. Dom4j和Xpath(转)
  2. 计算机的收获初一作文,初一关于收获的作文
  3. ASP:FileSystemObject处理文件
  4. mysql分页概念_MySQL学习笔记之数据定义表约束,分页方法总结
  5. 返回值 包装类_(九)Java常用类
  6. FPGA RAM时分复用减少逻辑资源
  7. 在数据库WSEDSQLDB中检测到一个可能的数据库一致性问题。|解决方法
  8. LU分解法求解线性方程组
  9. 分区助手磁盘移动毁我双系统
  10. 利用uniapp实现手机摇一摇H5项目
  11. 经典算法:计算两个日期之间的天数
  12. 微信会员卡跳转小程序实现
  13. 在产品中,我们常说的A端/B端/C端是什么?
  14. 关于显著性检验,有你想要的!
  15. 金山WPS:云端协同 AI赋能 WPS树起了Office新四大件|企服三会系列报道
  16. 【香蕉oi】Game(SAM,SG函数,假题)
  17. 区块链三加一 “成才”路上提个醒:区块链培训机构鱼龙混杂
  18. Java后端递归构建树形结构
  19. 松下PLC FP-XH M4L编程注意事项2
  20. linux淘宝秒杀脚本,在天猫及京东上秒杀不到飞天茅台的原因是有人用抢茅台脚本...

热门文章

  1. Blazor University (2)布局 — 创建 Blazor 布局
  2. 为record类型自定义Equals方法
  3. 单元测试 | 如何Mock IHttpClientFactory
  4. NCC CAP 6.0 发布 —— 新增支持 OpenTelemetry
  5. 关于async和await的探讨
  6. Rider 2021.3 Beta 现已推出
  7. Azure App Service 上的根证书
  8. WTMPlus 1.1 发布
  9. 微服务技术栈及分享计划
  10. 不想写脚本清理 mongodb 中的垃圾数据,ttlIndex 能帮到你!