介绍:

在我解释cache管理机制时,首先让我阐明下一个观念:IE下面的数据管理。每个人都会用不同的方法去解决如何在IE在管理数据。有的会提到用状态管
理,有的提到的cache管理,这里我比较喜欢cache管理,因为本人比较喜“cache”这个词。但是状态管理和cache管理这两个在概念和意义上
是不同的,下面就让我们来讨论下两都在各个方面的不同之处。

虽然cache管理并不存在于Windows程序,但在web环境中已经得到巨大的应用。自从HTTP变成无协议以来,在WEB上要想分辨两个不同请求变
得非常难,如何分辨如此多的请求变得非常重要,如果是同一请求,我们就可以把数据缓存起来供web上所有用户访问,减少数据重复进行物理加载。

asp.net提供了几种方法来缓存数据在客户端和服务器端,但是我们经常为到底用哪种方式而感动苦恼。asp.net提供了以下三种实现方式:

1:Session;2: Application 3: Cache objects,我们必须非常清楚它们之间的优势,这样才能充分利用它们的优势发挥在web程序中.

背景:

这篇文章中,我将简单涉及cache管理中的不同功能,在web程序中,我们为了避免因高并发产生的数据访问带来的性能问题,我们有必要把数据缓存于服务器端,使得后来的访问可以直接调用缓存数据,起到数据重用的作用。

缓存能够帮忙我们提到服务质量的三个重要方面:

性能:缓存数据达到数据重用.避免了重复的物理数据加载.
           可量测性:数据缓存后,减少了从服务器端加载数据。
           实用性:如果其它的系统或者是数据库发生死机,那么仍然可以从缓存中取得数据不受局部硬件的影响。

在一个web 程序中,我们可以数据缓存,页面缓存等等,让我们来看下数据缓存在服务器端和客户端的不同之处。

1.服务器端缓存:

   1.1Session状态管理:

session为每个人缓存数据.也就是说这样缓存的数据并不能同时供多人共享,限于为单个人缓存数据。
          状态管理有三种实现方式,分别是:
           1.11:InProc:
                 它的数据存储在aspnet_wp.exe 进程中,数据会因为IIS的重启而丢失。
           1.12:StateServer :
                 较InProc不同的是,它可以存储于不同的服务器中.
           1.133:SQLServer:

它的数据存储在数据库中,数据不会因为IIS的重启而丢失数据。

后两种方法与InProc最大的区别在于,我们要确保缓存的数据是可序列化的,否则只能用于第一种方式.为此我们要仔细分析从而选出最适合自己的方式.

下面是如何作用Session的代码片段:

Code

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); }

1.2 ASP.NET application
              asp.net为我们提供了另外一种全局变量保存方法,Application对象,它也是面向所有用户,它的生命周期和应用程序一样,当应用程序初始化后它就开始重建。但它最大的缺点是没有相关数据过期的方法,此时就要用到cache管理。

1.3 ASP.NET cache
               cache是我最喜欢用的机制,这也是为什么我喜欢说它的原因。它提供了键-值对应的
方法,cache对应的命名空间是:System.Web.Caching
它的生命周期也依赖于应用程序,但它并不像session,这也是面向所有用户的。虽然cache看起来特别像application,但它最大的不同是
提供了数据缓存失效控制方法以及数据缓存依赖管理。也就是说,在cache中我们可以非常容易的按照事先设定好的过期时间来让cache过期,删除
cache,我们也可以根据缓存依赖关系来操作cache,当依赖的关系有改动时,此时cache也会自动失效。而这都是applicaion没法办到
的。

现在让我们看下asp.net中是如何支持cache的过期以及数据缓存依赖的。

1.31:缓存依赖:

顾名思义它是指当事先设定的依赖关系发生变化时,cache 将会失效。在asp.net中提供了两种依赖关系:
                     1.311:文件缓存依赖:当磁盘上的一个文件发生变化时自动让cache失效
                       下面是实例代码:
object errorData;
//Load errorData from errors.xml
CacheDependency fileDependency =
     new CacheDependency(Server.MapPath("errors.xml"));

Cache.Insert("ERROR_INFO", errorData, fileDependency);

1.312:键值缓存依赖:
起来和文件缓存非常像,不同之外就是这种依赖方式不同而已,当有多个cache信息之间互相关联时,一个cache信息的变化将会引起其它cache的失
效。例如一个用户信息包含:编号,姓名,地址等,如果用户编号发生变化则cache失效,这种情况下,用户的基本信息就依赖于用户编号。
                       下面是示例代码:
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);

1.32:过期策略:从创建cache开始,一段时间后自动过期。
                           示例代码:
//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));

1.4 ASP.NET 页面输出缓存

有的时候在web站点中,有些页面在很长一段时间内都不会发生变化,例如一个招聘网站,它对于工资的描述文字一般不会经常更改,一般都是一个月更改一次,
所以在这一个月内,用户看到的内容都是一样的,所有如果把数据缓存在服务器端并不是完美的解决方案。这里可以用页面输出缓存。

下面是示例代码:
<%@OutputCache Duration="60" VaryByParam="empNum"
                                       Location="Server"%>

2:客户端缓存:

在上面的文章中,我讨论了些数据缓存在服务器端的方法,然而有的时候我们为了提高性能我们要把有些数据缓存到客户端。利用这种机制来达到缓解服务器压力,不过在客户端缓存数据会有各种不同的安全性问题,下面我说简要的说下相关内容:

2.1 Cookies:cookies在WEB程序开发中应用的非常广泛,它可以非常方便的在客户端与服务器端相互访问,不过它有数据大小限制,最大为4K,所有用它经常是保存小数据。同时cookie对于失效的控制也支持的相当完美。

下面是示例代码:

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);
}

2.2 ViewState:ViewState
是一个全新的概念,它一般用于页面或者是控件中保留数据以供和服务端交通。在ASP中的,我们存储数据是用隐藏控件来完成(Hidden
fields),ViewState也是这样用的,只不过它比隐藏控件更加安全性,所有的值都是经过hash处理的。如果你查看页面源代码,你都会看到
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();

}

2.3 隐藏控件 Hidden fields:它是最简单的,不用多说
                    下面是示例代码:
<!--In ASP.NET-->
<asp:HiddenField ID="myHiddenField" Value="Shubhabrata"
                                             runat="server" />
<!--In HTML-->

<input id="myHiddenField" type="hidden" value="Shubhabrata" />

asp.net 服务器端缓存与客户端缓存 [转]的更多相关文章

  1. HTTP缓存机制--客户端缓存(转)

    客户端缓存 客户端侧缓存一般指的是浏览器缓存,目的就是加速各种静态资源的访问,想想现在的大型网站,随便一个页面都是一两百个请求,每天 pv 都是亿级别,如果没有缓存,用户体验会急剧下降.同时服务器压力 ...

  2. 说说web缓存-强缓存、协商缓存

    网上关于WEB缓存的文章很多,今天汇总一下. 为什么要用缓存 一般针对静态资源如CSS,JS,图片等使用缓存,原因如下: 请求更快:通过将内容缓存在本地浏览器或距离最近的缓存服务器(如CDN),在不影 ...

  3. 细说ASP.NET Core静态文件的缓存方式

    一.前言 我们在优化Web服务的时候,对于静态的资源文件,通常都是通过客户端缓存.服务器缓存.CDN缓存,这三种方式来缓解客户端对于Web服务器的连接请求压力的. 本文指在这三个方面,在ASP.NET ...

  4. 客户端缓存(Client Cache)

    通常在服务器端大家都已经做了很多缓存的工作,ASP.NET CACHE也好MemeryCache也好却总是忽略了客户端缓存. 因为大家都知道不管哪个client都会缓存已经访问过的站点,但是浏览器缓存 ...

  5. Cookie客户端缓存.Session.Application

    Cookie客户端缓存. 1.引言 随着浏览器的处理能力不断增强,越来越多的网站开始考虑将数据存储在「客户端」,那么久不得不谈本地存储了. 本地存储的好处: 一是避免取回数据前页面一片空白,如果不需要 ...

  6. 使用服务器端控制AJAX页面缓存

    你知道 response.setHeader("Cache-Control","no-cache"); 这条语句是干什么的吗? 这是用来防止浏览器缓存动态内容生 ...

  7. Asp.Net中使用Couchbase——Memcached缓存使用篇

    Asp.Net中使用Couchbase——Memcached缓存使用篇 前言 在上一篇Asp.Net中使用Couchbase——Memcached缓存入门篇http://www.cnblogs.com ...

  8. 【ASP.NET 系列】浅谈缓存技术在ASP.NET中的运用

    本篇文章虽不谈架构,但是Cache又是架构中不可或缺的部分,因此,在讲解Cache的同时,将会提及到部分架构知识,关于架构部分,读者可以不用理解,或者直接跳过涉及架构部分的内容 你只需关心Cache即 ...

  9. ASP.NET结合Redis实现分布式缓存

    最近一个项目ASP.NET+MySQL 有的网页打开初始化的查询需要10秒甚至更久,用户体验极差,而且并发量变大的时候网站容易崩溃 后来想了两种解决方案都不是太满意 1.数据库里建一张缓存表,后台作业 ...

随机推荐

  1. 2014年12月23日00:42:54——PS4

    http://tieba.baidu.com/p/3415598015?see_lz=1&pn=1 http://tieba.baidu.com/p/3188981817 http://tie ...

  2. leetcode342——Power of Four(C++)

    Given an integer (signed 32 bits), write a function to check whether it is a power of 4. Example:Giv ...

  3. SCNU省选校赛第二场B题题解

    今晚的校赛又告一段落啦,终于"开斋"了! AC了两题,还算是满意的,英语还是硬伤. 来看题目吧! B. Array time limit per test 2 seconds me ...

  4. Java LoggingAPI 使用方法

    因为不想导入Log4j的jar,项目只是测试一些东西,因此选用了JDK 自带的Logging,这对于一些小的项目或者自己测试一些东西是比较好的选择. Log4j中是通过log4j.properties ...

  5. .net日志专用

    一个简单的.net写日志方法 - 可能的改进点 昨天有个朋友在评论的时候问我如下代码在web开发中有什么问题 public void Log(string msg) { System.IO.File. ...

  6. Php之Http请求urlencode/rawurlencode

    在http请求中,如果参数值带中文最好使用urlencode/rawurlencode函数. 如果参数值中带加号也最好使用,否则后台接收时,+号变成空格,引起不必要的麻烦. 注:urlencode和r ...

  7. MIS框架开发计划

    计划开发模块 缓存模块 全球化模块(时间转换.货币转换.语言切换.度量转换.时区转换) 用户模块 用户短消息模块 日志模块(系统日志.用户操作日志.安全审计日志) 权限模块 配置模块 事件模块(观察者 ...

  8. 怎么样调试正在运行的exe?

    最近在调虚幻的编辑器的时候遇到了一个问题. 调试模式运行UE4Editor.exe 实际上只是一个带参的命令行. 打开后,它又通过这个参数生成了一份详细配置,重新调用了自己.如图 这就悲剧了,断点都没 ...

  9. web开发工具IDE

    1.NetBeans 2.Zend Studio 3.JetBrains WebStorm 4.JetBrains PhpStorm 5.Koala 6.Ionic Lab 7.sublime 8.N ...

  10. POJ 2886 Who Gets the Most Candies? 线段树

    题目: http://poj.org/problem?id=2886 左右转的果断晕,题目不难,关键是准确的转啊转.因为题目要求输出约数个数最多的数,所以预处理[1,500000]的约数的个数就行了. ...