导出 (0) 打印
全部展开

如何:使用 Azure 角色中缓存

更新时间: 2013年8月

注:本页面内容可能不完全适用中国大陆地区运营的 Windows Azure服务。如要了解不同地区 Windows Azure 服务的差异, 请参考本网站.

缓存可以降低对同一结果的重复计算需求,从而提高 Web 应用程序的性能。使用缓存时,可以计算一次经常请求的内容和其他数据,存储起来重复使用。

可以参考本主题向 Windows Azure 应用程序添加缓存支持。借助 Windows Azure 角色中缓存,你可以设置缓存专用的角色,或者在要缓存的角色中使用其他未用的资源。例如,如果 Web 角色仅使用了各实例中可用资源的一半,那么可以使用这些资源来缓存输出、会话状态或常用数据。

在 Windows Azure 应用程序的 .cscfg 和 .csdef 文件中配置缓存,然后,可以使用角色的“缓存”属性页中的设置轻松执行此配置。若要在特定角色中使用缓存,可向该角色的 XML 配置文件添加信息。在 ASP.NET Web 角色中,相应的配置文件为 web.config。对于其他角色,该配置文件为 app.config。你可以手动向配置文件添加信息,也可以使用 NuGet 包进行添加。有关角色中缓存的详细信息,请参阅 Windows Azure 角色中缓存

缓存的配置方式有两种。可以添加缓存专用的缓存辅助角色,从而向云服务添加缓存,也可以将缓存配置为使用以前存在的角色上的内存、CPU 和带宽资源。专用缓存以独立角色的形式运行。如果希望实例资源专用于运行这些实例,此选项非常合适。并置缓存以此实例中另一角色的形式运行。如果角色实例不完全使用所运行计算机的资源,此选项非常合适。

本主题包含以下各节。

向云服务添加缓存

可以向现有角色添加缓存,也可以创建可从其他角色中使用的缓存辅助角色。

向云服务添加专用缓存辅助角色

  1. 打开 Windows Azure 项目的快捷菜单,然后选择“新建辅助角色项目”

  2. 在项目模板列表中,选择“缓存辅助角色”模板,然后指定项目的名称,如 CacheWorkerRole1。

    辅助角色项目已创建。

  3. 在 Windows Azure 项目下,展开“角色”节点,打开刚刚创建的缓存辅助角色的快捷菜单,然后选择“属性”

    随即出现此项目的角色设计器。

  4. “配置”选项卡上,为此角色设置恰当的虚拟机大小和实例数。

  5. 请注意,在“缓存”选项卡的“缓存群集设置”下,“专用缓存”已选中。

  6. 配置所需的默认缓存行为,或使用自定义属性创建一个命名缓存。

    各命名缓存都有自己的可配置属性值。指向表标题,显示有关如何能够配置各命名缓存的信息。有关详细信息,请参阅如何:配置 Azure 角色中缓存

向现有角色添加缓存

  1. 在 Windows Azure 项目中展开“角色”节点,打开要向其添加缓存的角色的快捷菜单,然后选择“属性”

  2. 在“缓存”选项卡上,选择“启用缓存”复选框。

  3. 选择“并置”选项,然后选择对于承载角色的虚拟机,要将其多少百分比的内存资源供缓存使用。通常,对“小型”虚拟机,此数值的范围应为 30% 到 55% 之间,对于“特大型”虚拟机,此数值最高为 80%。当云服务在普通负载下运行时,可以使用远程桌面登录虚拟机,然后使用任务管理器查看物理内存的百分比,从而优化此数值。剩余内存可用于并置的缓存。

  4. 配置所需的默认缓存行为,或使用自定义属性创建一个命名缓存。

在角色中使用缓存

可以按本部分中所述手动添加对项目的缓存引用,也可以按本主题后面的使用 NuGet 向角色添加缓存中所述使用 NuGet。手动添加引用可查看这些程序集在硬盘上的位置,但较为繁琐。

在 Web 角色中使用缓存

  1. 对于要在其中使用缓存的角色,在包含该角色的项目下,打开“引用”节点的快捷菜单,选择“添加引用”

  2. “添加引用”对话框中,选择相应的复选框,添加对以下程序集的引用,然后选择“确定”按钮:

    • Microsoft.ApplicationServer.Caching.AzureClientHelper

    • Microsoft.ApplicationServer.Caching.Client

    • Microsoft.ApplicationServer.Caching.Core

    • Microsoft.Web.DistributedCache

  3. 对于要向其中添加缓存的角色,在包含该角色的项目中,打开 Web 角色项目的 web.config 文件,或打开其他项目类型的 app.config 文件。

  4. 若 configSections 节不存在,请添加上。在该节中,添加缓存节的声明,如以下代码所示。

    <configSections>     <section name="dataCacheClients" type="Microsoft.ApplicationServer.Caching.DataCacheClientsSection, Microsoft.ApplicationServer.Caching.Core" allowLocation="true" allowDefinition="Everywhere"/>   </configSections> 
    
  5. 添加 XML,标识要使用的命名缓存。

    <dataCacheClients>     <tracing sinkType="DiagnosticSink" traceLevel="Verbose"/>     <dataCacheClient name="default">       <autoDiscover isEnabled="true" identifier="WebRole1"/>     </dataCacheClient>   </dataCacheClients> 
    

    如果只声明一个缓存,那么该名称可以是 default,如上一示例所示。如果要声明多个缓存,请为每个缓存添加一个单独的 dataCacheClient 节,为每个缓存给定一个唯一的名称。在代码中对 GetDefaultCache 对象调用 DataCacheFactory 方法时,将返回默认命名的缓存。identifier 特性指定要为其添加缓存支持的 Web 角色项目的名称,或是指定缓存辅助角色。

    现在,已在此角色中配置了分布式缓存,可以创建 DataCacheFactory 和 DataCache 对象,从代码中访问它。

  6. 在代码隐藏文件中,向“页”类添加声明,添加随机数生成器,以便得到一些数据来测试缓存。

            static DataCacheFactory myFactory;         static DataCache myCache;         static Random randomizer = new Random(); 
    
  7. 若要创建使用缓存的 Web 应用程序,请使用以下代码替换 Default.aspx Web 页中的代码。

    <%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"     CodeBehind="Default.aspx.cs" Inherits="WebRole1._Default" %>  <asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent"> </asp:Content> <asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">        <p style="font-size:large; height: 283px;">         <asp:Label ID="Label0" runat="server" Text="Text for the cache:   " />         <asp:TextBox runat="server" ID="TextBox1" Width="125" /> <br /> <br />          <asp:Button runat="server" onclick="OnPutInCache" Text="Put in Cache" id="AddCachedItemsButton" /> &nbsp;&nbsp;&nbsp;         <asp:Button runat="server" onclick="OnGetFromCache" Text="Get from Cache" id="GetCachedItemsButton" /> &nbsp;&nbsp;&nbsp;         <asp:Label ID="Label1" runat="server" Width="500" />          <br /> <br />  <br />               Cached Datestamp: <%= DateTime.Now.ToString() %><br />         Fresh Datestamp: <asp:Substitution runat="server" methodname="GetFreshDateTime" id="UnCachedArea" /><br /><br />     </p>  </asp:Content>  
    
  8. 添加代码以初始化缓存。

            protected void Page_Load(object sender, EventArgs e)         {             try             {                 //Get a named cache (or default cache)                 if (myCache == null)                 {                     // You should initialize the data cache factory                     // once and keep reusing the same object.                     myFactory = new DataCacheFactory();                     myCache = myFactory.GetDefaultCache();                     // If you want to get a handle to a named cache                     // that is not the default cache, supply the                     // cache's name from the configuration file:                     // myCache = myFactory.GetCache("anotherNamedCache");                 }             }             catch (DataCacheException dce)             {                 Label1.Text = dce.ToString();             }         } 
    

    在尝试使用缓存前,应调用此初始化代码。例如,可以将此代码添加到 Page_Load 事件处理程序。否则,使用缓存工厂方法 GetDefaultCache(),创建指向该缓存的句柄。如果未指定缓存名称,则使用命名为“默认”的缓存。每当使用缓存方法时,都可能引发异常 DataCacheException。上一代码会缓存该异常,在“标签”控件上向用户显示该异常。

  9. 添加代码以使用缓存。

            /// <summary>         /// Adds the value of the TextBox to the cache         /// </summary>         protected void OnPutInCache(object sender, EventArgs e)         {             try             {                 myCache.Put("MyKey", TextBox1.Text);                 Label1.Text = " \" " + TextBox1.Text + "\" has been added to the cache.";             }             catch (DataCacheException dce)             {                 Label1.Text = dce.ToString();             }         } 
    

    上一示例假设一个简单的 Web 窗体,含有文本框和按钮,但可以使用此代码来缓存任何数据。如示例中所示,使用 Put 方法可以向缓存添加数据。缓存以词典形式运行。第一个参数是密钥;第二个参数是要缓存的数据。

  10. 通过调用 Get 方法并提供密钥,从缓存中取回数据。

            /// <summary>         /// Gets the cached item (that was added from the TextBox)         /// </summary>         protected void OnGetFromCache(object sender, EventArgs e)         {             try             {                 string outputFromCache = myCache.Get("MyKey") as string;                 Label1.Text = "\"" + outputFromCache + "\" has been retrieved from the cache.";             }             catch (DataCacheException dce)             {                 Label1.Text = dce.ToString();             }         } 
    

为 ASP.NET 应用程序配置输出缓存

输出缓存可降低重新生成已取得数据的需求,从而提高网站性能。通过编辑应用程序的配置文件,可以使用分布式缓存来缓存 ASP.NET 应用程序的缓存输出,而无需更改程序代码。

在 ASP.NET 应用程序中缓存输出

  1. 对于要为其配置输出缓存的 ASP.NET 应用程序,打开其 web.config 文件。

  2. 添加以下行,将输出缓存配置为使用分布式缓存。

        <caching>       <outputCache defaultProvider="defaultProvider" >         <providers>           <add cacheName="default"                name="defaultProvider"                dataCacheClientName="nameOfDataCacheClient"                applicationName="<unique-appId>"                type= "Microsoft.Web.DistributedCache.DistributedCacheOutputCacheProvider, Microsoft.Web.DistributedCache" />         </providers>       </outputCache>     </caching> 
    

    对于 cacheName,使用指定 dataCacheClient 所承载的相应命名缓存的名称。dataCacheClient 特性指定承载该缓存的角色。

  3. 向要缓存输出的页中,添加 OutputCache 指令。

    <%@ OutputCache Duration="60" VaryByParam="*" %>
    

    持续时间是希望数据保留在缓存中的时间长度(以秒为单位)。VaryByParam 指示对于各个参数组合,应缓存不同版本的页。此上下文中的星号 (*) 表示,随所有参数而异。你也可以按名称指定参数。有关可用选项的完整说明,请参见 OutputCache 指令

    输出缓存配置完毕。

缓存会话状态

本节展示在不修改 ASP.NET Web 应用程序代码的情况下,如何缓存其会话状态信息。

缓存会话状态信息

  1. 对于要为其配置会话状态缓存的 ASP.NET Web 应用程序,打开其 web.config 文件。

  2. 添加以下行,指定要使用的缓存名称(在此例中为“默认”)、提供程序的名称、dataCacheClient 的名称和应用程序的 appId。

        <!--Set up custom session state provider -->     <sessionState mode="Custom" customProvider="defaultProvider">       <providers>         <add cacheName="default"              name="defaultProvider"              dataCacheClientName="nameOfDataCacheClient"              applicationName="<unique-appId>"              type= "Microsoft.Web.DistributedCache.DistributedCacheSessionStateStoreProvider, Microsoft.Web.DistributedCache"/>       </providers>     </sessionState> 
    

使用多个命名缓存

可以根据不同用途,创建和配置多个命名缓存。例如,可以有一个缓存用于输出,一个缓存以编程方式用于数据。

使用多个命名缓存

  1. 在角色设计器中,打开角色的“缓存”选项卡。

  2. “命名缓存”下,为输出和会话状态信息各添加一个命名缓存。

  3. “命名缓存”表中,设置命名缓存的属性。

    例如,对于输出缓存,逐出策略可以设置为“TTL”,对于会话状态缓存则可以设置为“无”

  4. 打开 web.config 文件,然后在 outputCache 和 sessionState 节中,将 cacheName 特性更改为新值。

使用 NuGet 向角色添加缓存

通过使用包管理器 NuGet,可以轻松地向现有角色添加缓存。如果已安装 Windows Azure Tools,NuGet 可以添加相应的引用,并对配置文件进行所需的修改。

使用 NuGet 添加角色中缓存

  1. 确保已安装最新版本的 NuGet。

    有关更多信息和安装说明,请参见 NuGet

  2. “解决方案资源管理器”中,对于要向其中添加缓存的角色,打开其项目节点的快捷菜单,然后选择“管理 NuGet 包”

    随即显示“管理 NuGet 包”对话框。

  3. 在联机库中选择“Windows Azure 角色中缓存”,然后选择“安装”按钮。

    将修改项目,添加对缓存程序集的引用,配置文件更新为配置缓存。

  4. 在项目的配置文件中,搜索 dataCacheClient 元素,它有 autoDiscover 子元素。

  5. 在该子元素中,将 identifier 特性的值更改为提供缓存的角色的名称。

        <dataCacheClient name="default">       <autoDiscover isEnabled="true" identifier="CacheWorkerRole1"/>     </dataCacheClient> 
    
  6. 若要开始使用缓存,请如本主题前面所述,修改代码。

    若要启用输出缓存或会话状态缓存,请编辑相应角色的配置文件,并进行其他更改,如本主题前面部分所述。若要以编程方式使用缓存,请向代码隐藏文件添加相应代码,创建缓存,添加和取得数据。

  7. (可选)若要管理整个解决方案的 NuGet 包,以及同时为多个项目添加缓存支持,请打开解决方案节点的快捷菜单,然后选择“管理 NuGet 包”

另请参见

社区附加资源

显示:
© 2014 Microsoft