关于asp.net中的缓存管理的分析

by ξ箫音ξ 6/16/2008 5:51:00 PM
导言
我比较喜欢使用的阶段性缓存管理(高速缓存)。但在概念上在这两者之间是没有分别的。现在让我们讨论不同方面的缓存管理(状态管理)在asp.net 。

虽然缓存管理问题不是一个在Windows的应用,它一直是一个挑战,在网络环境下。由于HTTP是一种协议和Web服务器识别用户之间不同的要求,它就成为非常重要的是,我们认识到一个特定的用户之间不同的要求,并存储数据,以便它能够重新使用之间的不同的要求。 asp.net提供了许多功能,存储数据,无论是在客户端(浏览器)和服务器( Web服务器),有时我们感到困惑什么时候该使用什么。在asp.net 里,我们碰到的这些功能,例如会话应用和高速缓存的对象,但最重要的是,我们要了解它们之间的差异,为了有效地使用他们在Web应用程序。

背景
在这篇文章中,我会解释,不同的缓存管理可供选择在asp.net的方案 。在Web应用程序,有时我们需要数据存储在服务器端,以避免付出高昂代价的数据检索操作,从数据存储和时间消费的数据格式的逻辑来提高应用程式效能,以及要求以后重新使用相同的数据。因此,要达到这个目标,我们需要存储(缓存)的数据在服务器端。

缓存可以帮助我们实现三个重要方面, QoS (服务质量) :

性能和缓存提高,使应用性能也随之提高,通过最小的数据检索和格式化操作。
可扩展性:由于缓存的最小的数据检索和格式化操作,减少了负荷对服务器的资源,从而增加了可扩展性的应用。
可用性:   由于应用程序使用的数据,从缓存申请有可能将产生的错误会在其他系统和数据库出现。
不同的选择
在Web应用程序,我们可以高速缓存数据,页面等无论是在服务器和客户端。让我们来看看在不同的可供选择的方案在asp.net为缓存的数据都在服务器和客户端。

服务器端的缓存管理
asp.net会话状态
asp.net会话状态是用来缓存数据每用户会话。这意味着,数据不能共享跨多个用户,数据使用量是有限的,以用户会话,这是创造asp.net会话的目的。

asp.net会话状态可以管理在三种不同的方法:

inproc :储存在Aspnet_wp.exe进程。会话资料时,遗失的过程中,或应用程序域是循环的。
stateserver :会话状态存储在一个单独的进程( a spnet_state.exe) ,它可以储存在一个不同的机器。因为它可以储存在不同的机器,此选项将工作在一个Web场的情况。
sqlserver :会话状态存储在一个SQL Server数据库。这个选项也将工作在一个Web场的情况。
无论是在stateserver和sqlserver选项,我们需要确保我们的对象缓存是串行数据仓库,是地地道道的过程系统。这两个方案的影响,该inproc的选择应用性能 作为数据检索和储存业务所采取更多的时候对比。因此,基于我们的应用要求,我们应该选择的选项,最适合我们的要求。

下面的示例显示如何Session对象可以用来在代码如下:

string empNum = Request.QueryString["empnum"];
if (empNum != null)
{
    string details = null;

    if (Session["EMP_DETAILS"] == null)
    {
        //Get Employee Details for employee number passed
        string details = GetEmployeeDetails(Convert.ToInt32(empNum));

        Session["EMP_DETAILS"] = details;
    }
    else
    {
        details = Session["EMP_DETAILS"];
    }

    //send it to the browser
    Response.Write(details);
}

asp.net应用程序对象
asp.net提供了一个对象所谓的应用对象来存储数据,是任何人都可以获得所有用户的请求。这个对象是联系在一起的应用,这是重新创建和启 动每一次的应用。不同的asp.net会话的对象,这个对象是方便所有用户的请求。由于这是仓库设立和维持在一个应用程序域空间,这不应被用于数据存储在Web场的情 况。这个选项是非常有用与数据存储一样,应用元数据( config文件的数据) ,当Application对象在应用程序启动起来时,可以用在应用而不需要重新装载它,并每一次为每个用户的请求。但如果是有规定的无效缓存的 数据,每当有任何改变到config文件,而应用程序正在运行,此选项不应当被用来作为它没有提供任何功能缓存数据。因此,在这种情况下其他选项一 样,asp.net Cache对象应使用,解释如下:

asp.net Cache对象
asp.net Cache对象是我最喜爱的缓存机制。这就是为什么我爱较多地了解它。asp.net提供了一个关键值配对的对象-Cache对象,其中,可在system.web.caching名字空间的范围。不同的asp.net Session对象,这个对象是方便所有用户的请求。

虽然两者的应用和高速缓存的物体看起来一样,关键的区别是补充所提供的功能Cache对象一样,到期的策略和依赖性的问题。这意味着,数据存储在 Cache对象,可过期/删除的基础上一些预设,所规定时限内应用程序代码,或依赖实体得到改变时,而无法使用此功能在Application的对象。

让我们讨论不同的时限和策略和相依赖与支持。

依赖
依赖是指一个项目可以从缓存中删除当一个依赖的实体得到改变。因此,依赖关系可以定义一个项目,其搬迁从缓存中,将取决于供养。有两种类型的相依性支持在asp.net 。

文件的依赖-这提供了一个选择删除的项目会自动从缓存每当一个磁盘文件的变化。让我们说,在我的应用程序,我使用XML文件来存储错误的详细资料(错误号 码和错误讯息映射)这是用来撷取一个错误讯息,为某一特定的错误号码在运行时。因此,不是读文件从磁盘,每次我需要一个错误讯息,让我们说,我决定负荷, 它一旦在应用程序启动和它储存在该asp.net缓存为进一步利用。所以,如果我需要更改config文件中添加新的错误讯息,或改变现有的一些错误讯 息,而应用程序正在运行,那么会发生什么事我缓存的数据?我是否需要停止应用程序,并再次启动它,以反映该文件的变化,在申请?答案是否定的。缓存数据可 以失效时,该文件的变化,利用档案的依赖选项。
下面的示例显示如何文件的依赖,可以用来无效缓存项目。所以当errors.xml文件更改缓存项目将自动获得过期,并会从缓存中删除。

 object errorData;
 //Load errorData from errors.xml
 CacheDependency fileDependency =
     new CacheDependency(Server.MapPath("errors.xml"));
 Cache.Insert("ERROR_INFO", errorData, fileDependency);

关键的依赖-主要是依赖类似文件的依赖,但唯一的区别是不是一个文件的项目,是依赖于另一个项目在缓存中得到失效时,依赖项目得到改变或撤销。这个选项是 有用的当多个相关的项目都被添加到缓存和这些项目被遣送离境,如果主要项目是改变。例如,为员工人数,姓名,地址和薪金都被添加到缓存,如果员工人数是更 新/删除所有有关雇员的信息都将被删除。在这种情况下,员工人数的依赖,可用于其他雇员的信息。
下面的示例显示如何关键的依赖,可以用来作废缓存的项目。

string[] relatedKeys = new string[1];
relatedKeys[0] = "EMP_NUM";
CacheDependency keyDependency = new CacheDependency(null, relatedKeys);
Cache["EMP_NUM"] = 5435;
Cache.Insert("EMP_NAME", "Shubhabrata", keyDependency);
Cache.Insert("EMP_ADDR", "Bhubaneswar", keyDependency);
Cache.Insert("EMP_SAL", "5555USD", keyDependency);

到期策略
到期的策略,订定策略,如何及何时一个项目在缓存中应届满。

基于时间到期-基于时间到期提供了一个选项届满一项目在缓存中,在预定的时间。到期时间可定为绝对时间一样, 2008年06月31日12时或滑动时间即相对目前的时候,该项目的访问。
//Absolute Expiration
Cache.Insert("EMP_NAME", "Shubhabrata", null,
             DateTime.Now.AddDays(1), Cache.NoSlidingExpiration);

//Sliding Expiration
Cache.Insert("EMP_NAME", "Shubhabrata", null,
             Cache.NoAbsoluteExpiration, TimeSpan.FromSeconds(60));

如何知道当一个项目被删除?
在上面的例子中,我们学会了如何删除一个项目从缓存中,但有时我们想知道当一个项目是从缓存中删除。是的,是有可能利用高速缓存的回调。在错误的细节,例如上面显示的,缓存项目的到期日时, errors.xml文件更改。假设我们要更新缓存的最新错误的详细资料。找出错误时的细节是从缓存中删除,我们可以使用高速缓存回调作进一步处理(重新加载错误的详细资料,再次向快取记忆体) 。

下面的例子说明如何使用缓存回调处理项目到期的情况:

private void AddItemsToCache()
{   
    int empNum = 5435;
    CacheItemRemovedCallback onEmpDetailsRemove =
                    new CacheItemRemovedCallback(EmpDetailsRemoved);
    Cache.Insert("EMP_NUM", empNum, null,
                              Cache.NoAbsoluteExpiration,
                              Cache.NoSlidingExpiration,
                              CacheItemPriority.Default,
                              onEmpDetailsRemove);
}

private void EmpDetailsRemoved(string key, object val,
                              CacheItemRemovedReason reason)
{
    //When the item is expired
    if (reason == CacheItemRemovedReason.Expired)
    {
        //Again add it to the Cache
        AddItemsToCache();    }
}

在上面的例子中,您必须注意到参数cacheitempriority用随回调方法。 cacheitempriority是用来设置优先的项目,我们加入到缓存中。优先需要设置告诉缓存incase低内存在服务器上删除缓存的项目,可用记忆体的基础上,优先设置。这个过程称为清除。

。 NET Remoting的
你可能会思考如何在。NET Remoting的可用于数据缓存?同样的问题,正如你所知道的。 NET Remoting的单身对象的股票相同的,例如与多个客户,使Singleton对象可以用来存储和共享数据之间不同的客户端调用。自。 NET Remoting的可用于以外的进程和机器,这个选项是非常有益的,当我们要高速缓存数据与分享不同的服务器和用户特别是在Web场的情况。在这方面的做 法,我们可以存储的数据作为成员变量的单身Remoting的对象,并提供方法来读取和保存数据。但是,尽管实施这一我们必须确保远程对象用来作为快取记 忆体是不是销毁由垃圾回收器。为此,我们将不得不设置在Remoting Cache对象的租赁期无限,使租赁期间从未倍。我们可以这样做,由凌驾于initializelifetimeservice方法 marshalbyrefobject并返回空从这个方法。但唯一的问题,这种做法的表现。作为分析说,表现极差,在这种方法时,比起其他的办法。无论如 何,这是向应用设计师/开发人员分析不同的选择和使用最好的之一,符合规定。

内存映射文件
大家都知道什么是内存映射文件。它基本上是有关映射磁盘上的文件到特定的地址范围,在该应用程序的进程地址空间。这个选项可以让不同的程序使用相同的数据,增加应用性能。使用内存映射文件是不是很受欢迎。 NET开发,我个人不建议这种做法作为贯彻落实这涉及到了很多的复杂性和也。 NET框架不支持这一点。但如果任何人都非常有兴趣使用这种方法,然后他们将必须发展自己的自定义解决方案为百分之自己的要求。

静态变量
我们使用静态变量用于存储数据或物体在全球范围,以便它可以访问期间的生活应用。同样,在asp.net ,我们可以使用静态对象缓存的数据,我们也可以提供方法以检索和保存数据传送到高速缓存。作为静态变量都存储在进程方面,表现明智的,这是速度更快。但因为它是非常困难的实施到期的政策和相依incase的静态变数,我一般宁愿asp.net Cache对象超过这个选项。另一个问题是,自定义静态Cache对象要线程安全的,其中有即将实施的审慎。

自定义静态Cache对象可以被界定为如下所示:

public class CustomCache
{
    //Synchronized to implement thread-safe
    static Hashtable _myCache =
             Hashtable.Synchronized(new Hashtable());
   
    public static object GetData(object key)
    {
        return _myCache[key];
    }
   
    public static void SetData(object key, object val)
    {
        _myCache[key] = val;
    }
}

数据库
我们也可以使用一个数据库,用于存储数据和分享数据,全国用户和机器。这种做法是非常有用的,当我们要快取记忆体的大量数据。使用这种方法储存的少量数 据,是不是一个好主意,因为表现。储存的少量数据,我们应该走在其他asp.net进程缓存机制。作为数据必须存储在一个数据库中的所有对象必须XML的 系列化,使其更容易存储和检索。我们也可以使用其他类型的系列化可用的格式在。 NET Framework 。

asp.net页面输出缓存
有时在我们的应用在一些页面的输出,一般不会改变为某一特定时期的时间。例如在一个人力资源网站,薪金的详情,雇员不改变已非常频密和它的变化,只有一 次,在一个月内。一般来说,改变只对第一天的每一个月。因此,在一个月的薪金详情页将显示相同的细节,针对特定的雇员。因此,在这种情况下,是不是一个好 主意,缓存的网页的某个服务器,以避免商业计算处理,调用数据库和网页呈现逻辑每一次雇员希望看到他的薪金细节。我认为,是的!这是一个非常好的主意。要 做到这一点, asp.net提供了一个功能来存储输出一个网页在服务器上为某一特定时期的时间。它还提供了功能,以存储片段的一个网页,其中被称为页的片段缓存。在这 里我不打算谈了很多页输出缓存有其他物品可在互联网上,涵盖这一机制的详细研究。这将一个非常漫长的一段,如果我开始讨论它。我的规划,以支付这在另一篇 文章。

<!-- VaryByParm - different versions of same page will be
cached based on the parameter sent through HTTP Get/Post
Location - where the page is cached -->
<%@OutputCache Duration="60" VaryByParam="empNum"
                                       Location="Server"%>
 

选择工程在Web场的情况呢?言论
asp.net会话状态
-i nproc
-s tateserer
-s qlserver
 

 不像其他的选择,只存储用户会话的具体数据
asp.net应用程序对象没有
asp.net Cache对象没有
。 NET Remoting的是
内存映射文件没有
静态变量没有
数据库是
asp.net页面输出缓存没有

客户端缓存管理
在前面几节我们讨论了关于不同的缓存选项可在服务器端,但有时我们可能需要缓存的数据或页面在客户端,以改善应用性能。利用这个机制,减少负载在服务器 上,但这个机制有一些安全问题,因为我们缓存的数据在客户端。有不同的可供选择的方案,为客户端高速缓存。我要简单地谈一谈关于几个人。

饼干
Cookie是非常熟悉的任期在Web的发展环境。 Cookie是客户端的存储是发送到服务器对于每个请求和还收到了作为回应,回到从服务器。因为它的大小限制( 4096字节)应该用作贮存少量的数据。到期的政策,可以设置的Cookie无效的项目在一定期限之后的时间。以下示例显示了如何的Cookie可以用来在一个asp.net应用程序:

if (this.Request.Cookies["MY_NAME"] == null)
{
    this.Response.Cookies.Add(new HttpCookie("MY_NAME",
                                       "Shubhabrata Mohanty"));
}
else
{
    this.Response.Write(this.Request.Cookies["MY_NAME"].Value);
}

的Viewstate
asp.net的Viewstate是一个新概念。这里的数据涉及到的页面和控制都存储在其中的ViewState保留价值的跨越多个请求到服务器。如果您没有记错的话,在VB的ASP应用程式,我们用于存储数据跨越多个请求使用隐藏字段。的ViewState ,其实是实施内部隐藏栏位,在asp.net ,但在这里的数据是虚线,以提高安全性作为对隐藏的领域。看看怎样的Viewstate实施,您可以查看来源网页,其中的ViewState是用来在网际网路浏览器。的Viewstate不应被用来存储大量的数据,因为它是通过向服务器对于每个请求。

protected void Page_Load(object sender, EventArgs e)
{
    if (this.ViewState["MY_NAME"] == null)
    {
        this.ViewState["MY_NAME"] = "Shubhabrata Mohanty";
    }
   
    //txtName is a TextBox control
    this.txtName.Text = this.ViewState["MY_NAME"].ToString();
}

隐藏栏位
隐藏栏位都非常受欢迎, VB的ASP的Web开发。隐藏栏位的是类似的任何其他控制在一个网页,但有形的状态,这是控制始终是假的。一样的Viewstate我们不应该用它来存储大量的数据。注:同样隐藏帧可以用来缓存数据在客户端。但请注意,隐藏帧不支持所有的互联网浏览器。

<!--In ASP.NET-->
<asp:HiddenField ID="myHiddenField" Value="Shubhabrata"
                                             runat="server" />
<!--In HTML-->
<input id="myHiddenField" type="hidden" value="Shubhabrata" />

Microsoft Internet Explorer的缓存
由于我谈论asp.net的话,为何不讨论另一个缓存的能力,从微软? Microsoft Internet Explorer中提供了缓存机制来缓存页面在客户端。这可以设置使用期满后的指令添加到标题的网页,或通过设置手动在IIS 。在IIS到HTTP标题标签的属性窗口的网页,然后选择启用内容过期复选框。我们应该使用这个选项来缓存静态页面和图像在客户端。

结论
希望我已清楚的解释了所有不同的选择。现在的时间要回去我们开始实施这些选项。在实施任何这些选项应该做的事,纯粹是在此基础上需要我们对应用的要求和适当的评论。

我希望更多的读者,提供宝贵的意见。

Currently rated 3.0 by 5 people

  • Currently 3/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

Add comment


(Will show your Gravatar icon)  

  Country flag

[b][/b] - [i][/i] - [u][/u]- [quote][/quote]



Live preview

10/7/2008 7:00:50 PM

Powered by crfly.com ver:1.5.0.0. Original Powered by BlogEngine.NET.

关于博主

Name of author 博主姓名
关于博主的简短介绍……

发邮件给我 Send mail


日历

<<  October 2008  >>
MonTueWedThuFriSatSun
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

分类




Recent comments


Pages




声明

本博所有网友评论不代表本博立场,版权归其作者所有。

© Copyright 2008

登录