C# - 缓存OutputCache(二)缓存详细介绍

本文是经过网上&我的总结的html

 

1.缓存介绍web

缓存是为了提升访问速度,而作的技术。数据库

缓存主要有如下几类:1)客户端缓存Client Caching 2)代理缓存Proxy Caching 3)方向代理缓存Reverse Proxy Caching 4)服务器缓存Web Server Caching数组

而在ASP.NET中,只有两种缓存:输出缓存、数据缓存。缓存

 

2.输出缓存安全

这是最简单的缓存类型,它保存发送到客户端的页面副本,当下一个客户端发送相同的页面请求时,此页面不会从新生成(在缓存有限期内),而是从缓存中获取该页面;固然因为缓存过时或被回收,这时页面会从新生成。服务器

输出缓存能够把最终呈现的页面缓存起来,当客户端再次请求同一页面时,控制对象再也不从新建立,页面的生命周期再也不启动,无需再次执行代码,经过在缓存中获取缓存的页面。性能

 

每当用户发送请求时,都没更新页面的显示时间,此次因为每次请求都获取了一个新的页面。在实际状况中,咱们并不须要实时的响应用户每一个页面的请求,咱们能够经过缓存起来,每当用户请求时,而且在有效时间内,能够经过输出缓存把缓存的页面返回给用户。this

如今,咱们写个例子,每隔20秒缓存起来,而且返回一个时间:spa

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MVCFilter.Controllers
{

    public class DefaultController : Controller
    {

        [OutputCache(Duration = 20, VaryByParam = "None")]
        public ActionResult Index()
        {
            return this.Json(DateTime.Now.ToString("T"),JsonRequestBehavior.AllowGet);
        }  
    }
}

上面的例子,在20秒内,同时访问,都会放回同一个时间,20秒事后放回另一个不一样时间。由于,咱们在20秒内把它缓存起来了。

输出缓存的5个属性:

属性 说明
Duration 必需属性。页面应该被缓存的时间,以秒为单位。必须是正整数。
Location 指定应该对输出进行缓存的位置。若是要指定该参数,则必须是下列选项之一:Any、Client、Downstream、None、Server 或 ServerAndClient。
VaryByParam 必需属性。Request 中变量的名称,这些变量名应该产生单独的缓存条目。"none" 表示没有变更。"*" 可用于为每一个不一样的变量数组建立新的缓存条目。变量之间用 ";" 进行分隔。
VaryByHeader 基于指定的标头中的变更改变缓存条目。
VaryByCustom

容许在 global.asax 中指定自定义变更(例如,"Browser")。

 

3.Query String缓存

在前面的例子中,咱们把OutputCache中的VaryByParam属性设置为None,那么ASP.NET程序只缓存一个页面副本;若是页面请求包含查询参数,那么在缓存的有效期内,咱们只能够查看到只是缓存结果,假设在上面的代码中,加个id参数,就变成了QueryString参数缓存。意思是若是参数不一样,缓存的页面不一样。

例如,id=1缓存一个页面,id=2缓存另一个页面,以此类推。

VaryByParam能够填*,即是全部参数都缓存,若是有多个参数,则中间用逗号隔开:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MVCFilter.Controllers
{

    public class DefaultController : Controller
    {

        [OutputCache(Duration = 20, VaryByParam = "id")]//VaryByParam能够填*,即是全部参数都缓存,若是有多个参数,则中间用逗号隔开。
         //加了id的参数
         public ActionResult Index(string id)
        {
            return this.Json(DateTime.Now.ToString("T"),JsonRequestBehavior.AllowGet);
        }   
    }
}

 

4.CacheProfile属性

从上述看出,在通常项目中,会有多个Controller,与多个Action。若是这样,咱们都要在Controller或Action上面写上咱们的OutputCache,不利于开发与维护,增大了工做量。因此,咱们能够利用CacheProfile属性,来设置咱们全局的值。

首先咱们在webconfig文件中添加全局的值:

<system.web>
    <caching>
      <outputCacheSettings>
        <outputCacheProfiles>
          <add name="myProfiles" duration="10" enabled="true"/>
        </outputCacheProfiles>
      </outputCacheSettings>
    </caching>
  </system.web>

而后,咱们写上要引入的名字myProfiles就能够了

        [OutputCache(CacheProfile = "myProfiles")]
        public ActionResult Index(){}

 

5.数据缓存

Cache对象是线程安全:这表示无需显式实现锁定或解锁,在添删Cache对象中的元素,然而,在Cache对象中元素必须是线程安全的。例如,咱们建立一个实体Product,并且存在多个客户端可能同时操做该对象的状况,这时咱们必须为实体Product实现锁定和解锁操做(同步操做请参考《单例模式(Singleton)的6种实现》)。

Cache对象中的缓存项自动移除:当缓存过时,依赖项被修改或内存不足缓存ASP.NET会自动移除该缓存项。

缓存项支持依赖关系:咱们能够给缓存项添加文件、数据库表或其余资源类型的依赖关系。

 

6.总结

缓存可使应用程序的性能获得很大的提升,所以在设计应用程序应该予以考虑,本博文主要介绍了ASP.NET中输出缓存和数据缓存的应用场合和区别。

页面缓存适用于生成的页面一般都相同或改变时间比较固定状况,例如:数据在每小时都会更新,那么咱们能够设置duration为3600s。

数据缓存适用生成的页面老是在变化状况。

相关文章
相关标签/搜索