ASP.NET 数据缓存


缓存是一种将经常使用的数据/信息存储在内存中的技术,以便下次需要相同的数据/信息时,可以直接从内存中检索,而不是由应用程序生成。

缓存对于 ASP.NET 中的性能提升非常重要,因为页面和控件是在此处动态生成的。这对于与数据相关的事务尤其重要,因为这些事务在响应时间方面很昂贵。

缓存将经常使用的数据放置在快速访问的媒体中,例如计算机的随机存取存储器。 ASP.NET 运行时包含一个名为缓存的 CLR 对象的键值映射。这驻留在应用程序中,可通过 HttpContext 和 System.Web.UI.Page 获得。

在某些方面,缓存类似于存储状态对象。但是,状态对象中的存储信息是确定性的,也就是说,你可以指望存储在那里的数据,而数据的缓存是不确定的。

在以下情况下,数据将不可用:

  • 如果它的寿命到期,
  • 如果应用程序释放它的内存,
  • 如果由于某种原因没有进行缓存。

你可以使用索引器访问缓存中的项目,并且可以控制缓存中对象的生命周期,并在缓存对象与其物理源之间建立链接。

ASP.Net 中的缓存


ASP.NET 提供以下不同类型的缓存:

  • 输出缓存 :输出缓存存储最终呈现的 HTML 页面的副本或发送给客户端的部分页面。当下一个客户端请求该页面时,不会重新生成该页面,而是发送该页面的缓存副本,从而节省时间。

  • 数据缓存 :数据缓存是指缓存来自数据源的数据。只要缓存没有过期,就会从缓存中完成对数据的请求。当缓存过期时,数据源获取新数据并重新填充缓存。

  • Object Caching :对象缓存是缓存页面上的对象,例如数据绑定控件。缓存的数据存储在服务器内存中。

  • 类缓存 :第一次运行时,Web 页面或 Web 服务在程序集中编译为页面类。然后程序集被缓存在服务器中。下次对页面或服务发出请求时,将引用缓存的程序集。当源代码更改时,CLR 重新编译程序集。

  • 配置缓存 :应用程序范围的配置信息存储在配置文件中。配置缓存将配置信息存储在服务器内存中。

在本教程中,我们将考虑输出缓存、数据缓存和对象缓存。

输出缓存


渲染页面可能涉及一些复杂的过程,例如数据库访问、渲染复杂控件等。输出缓存允许通过在内存中缓存数据来绕过到服务器的往返。甚至整个页面都可以被缓存。

输出Cache 指令负责输出缓存。它启用输出缓存并对其行为提供一定的控制。

输出Cache 指令的语法:

<%@ 输出Cache Duration="15" VaryByParam="None" %>

将此指令放在页面指令下。这告诉环境将页面缓存 15 秒。以下页面加载事件处理程序将有助于测试页面是否真的被缓存。

protected void Page_Load(object sender, EventArgs e)
{
    Thread.Sleep(10000);
    Response.Write("This page was generated and cache at:" +
    DateTime.Now.ToString());
}

The 线程.睡眠() 方法将进程线程停止指定的时间。在本例中,线程停止了 10 秒,因此第一次加载页面时,需要 10 秒。但是,下次刷新页面时不会花费任何时间,因为页面是从缓存中检索的,而没有加载。

输出Cache 指令具有以下属性,有助于控制输出缓存的行为:

属性 Values 描述
DiskCacheable 真假 指定可以将输出写入基于磁盘的缓存。
NoStore 真假 指定是否发送“no store”缓存控制标头。
缓存配置文件 String name 要存储在 web.config 中的缓存配置文件的名称。
随参数变化

None

*

参数名称
分号分隔的字符串列表指定 GET 请求中的查询字符串值或 POST 请求中的变量。
VaryByHeader

*

标题名称

分号分隔的字符串列表指定客户端可能提交的标头。
因定制而异

Browser

自定义字符串

告诉 ASP.NET 通过浏览器名称和版本或自定义字符串来改变输出缓存。
Location

Any

Client

下游

Server

None

Any:页面可以缓存在任何地方。

客户端:缓存的内容保留在浏览器中。

下游:存储在下游和服务器中的缓存内容。

服务器:缓存内容仅保存在服务器上。

无:禁用缓存。

Duration Number 页面或控件被缓存的秒数。

让我们在前面的示例中添加一个文本框和一个按钮,并为该按钮添加这个事件处理程序。

protected void btnmagic_Click(object sender, EventArgs e)
{
    Response.Write("<br><br>");
    Response.Write("<h2> Hello, " + this.txtname.Text + "</h2>");
}

更改 输出Cache 指令:

<%@ 输出Cache Duration="60" VaryByParam="txtname" %>

程序执行时,ASP.NET 根据文本框中的名称缓存页面。

数据缓存


数据缓存的主要方面是缓存数据源控件。我们已经讨论过数据源控件表示数据源中的数据,例如数据库或 XML 文件。这些控件派生自抽象类 DataSourceControl 并具有以下用于实现缓存的继承属性:

  • 缓存持续时间 - 它设置数据源将缓存数据的秒数。

  • 缓存过期策略 - 它定义了缓存中的数据过期时的缓存行为。

  • CacheKeyDependency - 它为控件标识一个键,该键在删除时自动过期其缓存的内容。

  • 启用缓存 - 它指定是否缓存数据。

例子

为了演示数据缓存,请创建一个新网站并在其上添加一个新的 Web 表单。添加一个 SqlDataSource 控件,其中包含已在数据访问教程中使用的数据库连接。

对于此示例,向页面添加一个标签,该标签将显示页面的响应时间。

<asp:Label ID="lbltime" runat="server"></asp:Label>

除标签外,内容页面与数据访问教程中的相同。为页面加载事件添加事件处理程序:

protected void Page_Load(object sender, EventArgs e)
{
    lbltime.Text = String.Format("Page posted at: {0}", DateTime.Now.ToLongTimeString());
}

设计的页面应如下所示:

Data Caching

第一次执行页面时,没有什么不同,标签显示,每次刷新页面时,页面都会重新加载,并且标签上显示的时间会发生变化。

接下来,将数据源控件的 EnableCaching 属性设置为“true”,并将 Cacheduration 属性设置为“60”。它将实现缓存,缓存将每 60 秒过期一次。

时间戳随着每次刷新而改变,但是如果你在这 60 秒内改变了表中的数据,在缓存过期之前是不会显示的。

<asp:SqlDataSource ID = "SqlDataSource1" runat = "server" 
    ConnectionString = "<%$ ConnectionStrings: ASPDotNet步骤By步骤ConnectionString %>"
    ProviderName = "<%$ ConnectionStrings: ASPDotNet步骤By步骤ConnectionString.ProviderName %>"
    SelectCommand = "SELECT * FROM [DotNetReferences]"
    EnableCaching = "true" CacheDuration = "60">
</asp:SqlDataSource>

Object Caching


Object caching provides more flexibility than other cache techniques. You can use object caching to place any object in the cache. The object can be of any type - a data type, a web control, a class, a dataset object, etc. The item is added to the cache simply by assigning a new key name, shown as follows Like:

Cache["key"] = item;

ASP.NET 还提供了用于将对象插入缓存的 Insert() 方法。此方法有四个重载版本。让我们看看它们:

Overload 描述
缓存.插入((键,值); 使用具有默认优先级和过期时间的键名和值将项目插入缓存。
Cache.Insert(key, value, dependencies); 使用键、值、默认优先级、过期时间和链接到其他文件或项目的 CacheDependency 名称将项目插入缓存,以便在这些更改时缓存项目不再有效。
Cache.Insert(键,值,依赖,absoluteExpiration,slidingExpiration); 这表明到期策略以及上述问题。
Cache.Insert(键,值,依赖项,absoluteExpiration,slidingExpiration,优先级,onRemoveCallback); 这与参数一起还允许你设置缓存项的优先级和一个委托,该委托指向在删除项时要调用的方法。

滑动到期用于在指定的时间跨度内未使用时从缓存中删除项目。下面的代码片段存储了一个滑动过期为 10 分钟且没有依赖关系的项目。

Cache.Insert("my_item", obj, null, DateTime.MaxValue, TimeSpan.FromMinutes(10));

例子

创建一个只有一个按钮和一个标签的页面。在页面加载事件中编写如下代码:

protected void Page_Load(object sender, EventArgs e)
{
    if (this.IsPostBack)
    {
        lblinfo.Text += "Page Posted Back.<br/>";
    }
    else
    {
        lblinfo.Text += "page Created.<br/>";
    }
   
    if (Cache["testitem"] == null)
    {
        lblinfo.Text += "Creating test item.<br/>";
        DateTime testItem = DateTime.Now;
        lblinfo.Text += "Storing test item in cache ";
        lblinfo.Text += "for 30 seconds.<br/>";
        Cache.Insert("testitem", testItem, null,
        DateTime.Now.AddSeconds(30), TimeSpan.Zero);
    }
    else
    {
        lblinfo.Text += "Retrieving test item.<br/>";
        DateTime testItem = (DateTime)Cache["testitem"];
        lblinfo.Text += "Test item is: " + testItem.ToString();
        lblinfo.Text += "<br/>";
    }
      
    lblinfo.Text += "<br/>";
}

第一次加载页面时,它说:

Page Created.
Creating test item.
Storing test item in cache for 30 seconds.

如果你在 30 秒内再次单击该按钮,页面将被回发,但标签控件会从缓存中获取其信息,如下所示:

Page Posted Back.
Retrieving test item.
Test item is: 14-07-2010 01输出Cache 指令的语法:04