• C#


    本文是通过网上&个人总结的

    1.缓存介绍

    缓存是为了提高访问速度,而做的技术。

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

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

    2.输出缓存

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

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

    每当用户发送请求时,都没更新页面的显示时间,这次由于每次请求都获取了一个新的页面。在实际情况中,我们并不需要实时的响应用户每个页面的请求,我们可以通过缓存起来,每当用户请求时,并且在有效时间内,可以通过输出缓存把缓存的页面返回给用户。

    现在,我们写个例子,每隔20秒缓存起来,并且返回一个时间:

    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。

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

  • 相关阅读:
    Excel与Google Sheets中实现线性规划求解
    Optaplanner终于支持多线程并行运行
    【译】Optaplanner开发手册本地化: (0)
    多工序、多机台(产线)环境下的排程要点
    设计Optaplanner下实时规划服务的失败经历
    Optaplanner规划引擎的工作原理及简单示例(2)
    vim 分屏
    vim autocmd
    irun vcs option
    记录
  • 原文地址:https://www.cnblogs.com/alunchen/p/6255736.html
Copyright © 2020-2023  润新知