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

云带来的改变是显而易见的,云计算是一种按使用量付费的模式,这种模式提供可用的、便捷的、按需的网络访问, 进入可配置的计算资源共享池(资源包括网络,服务器,存储,应用软件,服务),这些资源能够被快速提供,只需投入很少的管理工作,或与服务供应商进行很少的交互。本系列包括 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跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/327012.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

稀疏数组与二维数组相互转化

图示 二维数组转稀疏数组的思路 遍历 原始的二维数组&#xff0c;得到有效数据的个数 sum根据sum 就可以创建 稀疏数组 sparseArr int[sum 1] [3]将二维数组的有效数据数据存入到 稀疏数组 稀疏数组转原始的二维数组的思路 先读取稀疏数组的第一行&#xff0c;根据第一行的…

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

云带来的改变是显而易见的&#xff0c;云计算是一种按使用量付费的模式&#xff0c;这种模式提供可用的、便捷的、按需的网络访问&#xff0c; 进入可配置的计算资源共享池&#xff08;资源包括网络&#xff0c;服务器&#xff0c;存储&#xff0c;应用软件&#xff0c;服务&am…

excel打开csv 出现乱码怎么解决 逗号分隔

excel打开csv 出现乱码怎么解决 https://jingyan.baidu.com/article/ac6a9a5e4c681b2b653eacf1.html CSV是逗号分隔值的英文缩写&#xff0c;通常都是纯文本文件。CSV格式是分隔的数据格式&#xff0c;有字段/列分隔的逗号字符和记录/行分隔换行符。通常CSV文件可以用EXCEL正常…

在ASP.NET Core下使用SignalR技术

一、前言 上次我们讲到过如何在ASP.NET Core中使用WebSocket,没有阅读过的朋友请参考 WebSocket in ASP.NET Core 文章 。这次的主角是SignalR它为我们提供了简化操作WebSocket的框架。 ASP .NET SignalR 是一个ASP.NET 下的类库&#xff0c;可以在ASP.NET 的Web项目中实现实时…

mybatis简单案例源码详细【注释全面】——前期准备

mybatis 是个什么东西&#xff0c;这里就不必说了&#xff0c;大家去网上搜搜看就行了&#xff0c;在这里我主要是分享一下最基本的增删改查案例以及配置信息&#xff0c;测试信息。 首先我们创建个数据库&#xff1a; /* SQLyog 企业版 - MySQL GUI v8.14 MySQL - 5.5.40 : …

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

撤消由一系列步骤&#xff0c;它们共同限定了最终一致性操作中&#xff0c;如果一个或多个步骤失败执行的工作。按照最终一致性模型&#xff0c;业务实现复杂的业务流程和工作流的云托管的应用程序中很常见。 背景和问题 在云中运行的应用程序频繁修改数据。此数据可跨在各种地…

API网关Ocelot 使用Polly 处理部分失败问题

在实现API Gateway过程中&#xff0c;另外一个需要考虑的问题就是部分失败。这个问题发生在分布式系统中当一个服务调用另外一个服务超时或者不可用的情况。API Gateway不应该被阻断并处于无限期等待下游服务的状态。但是&#xff0c;如何处理这种失败依赖于特定的场景和具体服…

数组模拟环形队列

思路分析 代码实现 package com.atguigu.queue;import java.util.Calendar; import java.util.Scanner;/*** 创建人 wdl* 创建时间 2021/3/17* 描述*/ public class CircleArrayQueueDemo {public static void main(String[] args) {//测试一把System.out.println("测试数…

Error:(1, 10) java: 需要class, interface或enum

https://blog.csdn.net/zf18234031156/article/details/103047649 反复做这一步&#xff0c;30多个文件一个一个弄&#xff0c;有乱码用txt打开&#xff0c;黏贴覆盖&#xff0c; 目录 1.前言 2.原因(UTF-8BOM造成) 3.如何解决 3.11使用Notepad&#xff0c;选择“格式--以…

彻底理解ThreadLocal

转载自 彻底理解ThreadLocal 先总述&#xff0c;后分析 深挖过threadLocal之后&#xff0c;一句话概括&#xff1a;Synchronized用于线程间的数据共享&#xff0c;而ThreadLocal则用于线程间的数据隔离。所以ThreadLocal的应用场合&#xff0c;最适合的是按线程多实例&#xff…

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

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

前后端分离趋势谈

最近已经不止一个人和我提起过vue了&#xff0c;在我的前端印象中&#xff0c;我还停留在smarty渲染模版&#xff0c;jquery做js处理。学了一晚上&#xff0c;对现在这种工程化webpack打包生成html&#xff0c;js&#xff0c;css的生产方式越来越有兴趣了。工作年限摆在这里的好…

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

合并多个任务或操作成一个单一的计算单元。这种模式可以提高计算资源的利用率&#xff0c;并降低与云托管的应用程序进行计算处理相关的成本和管理开销。 背景和问题 云应用程序频繁执行各种操作。在某些解决方案也可能是有意义的最初遵循的关注点分离的设计原则&#xff0c;并…

Visual Studio 2017 RC3支持.NET Core,延迟对Python的支持

Visual Studio 2017第三个候选版本上周发布&#xff0c;解决了之前发现的安装程序的小问题。由于这些问题得到了解决&#xff0c;现在值得关注的就是这次版本中更新了什么内容。&#xff08;版本是发布于1月27日的build 26127.00&#xff09; RC3版本中最值得关注的部分就是对N…

虚拟研讨会:.NET的未来在哪里?

.NET生态系统在过去的一年中发生了很多事情。在几个方面发展非常迅速&#xff1a;Xamari、UWP、.NET Core、.NET native、F#和开源等等。 如果要关注细节&#xff0c;那大的景象难以描绘。因为在每个方面都有新的动作&#xff1a;跨平台、云、移动、Web应用和通用应用。开发人员…

使用Servlet上传多张图片——访问提示

上传文件&#xff0c;我们在做项目中补课避免的&#xff0c;有时候我们需要上传单张或者单个文件&#xff0c;但是有时候我们就需要上传多个文件或者多张图片了&#xff0c;我们这里以多张&#xff08;4张&#xff09;图片为例&#xff0c;再多也都是一样的概念&#xff0c;接下…

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

隔离&#xff0c;通过使用不同的接口&#xff0c;从操作读取数据更新数据的操作。这种模式可以最大限度地提高性能&#xff0c;可扩展性和安全性;支持系统在通过较高的灵活性&#xff0c;时间的演变;防止更新命令&#xff0c;从造成合并在域级别上的冲突。 背景和问题 在传统的…