• ASP.NET MVC如何使用输出缓存


    通过这篇文章你将学习到在MVC中如何使用输出缓存,业务逻辑我就不多介绍了,主要是Outputcache的基本使用。至于数据缓存还是等我的下一篇文章吧,一步一步来不急的。
     
    输出缓存的使用方法是在Controller 或Action上打[OutPutCache]特性即可。我这里以Action为示例
    
    [OutputCache(Duration =20)]//设置过期时间为20秒
    public ActionResult ExampleCache()
    {
       var timeStr =DateTime.Now.ToString("yyyy年MM月dd日 HH时mm分ss秒");
       ViewBag.timeStr = timeStr;
       return View();
    }
    我们在页面上可以很明显地看到:


    在20秒时间差距内页面上的时间都不会被改变。他在Response Header中过期时间和上次修改的时间正好相隔20秒。Http StatusCode 304 这个我得简单介绍下,这个页面是缓存在客户端浏览器的,服务器在接收响应时(还没有超过20秒)并没有返回给浏览器一个新的html文档,只是告诉浏览器 No Modified,从本地去读取即可。当然有必要去了解一下304 ,介绍看看这篇文章http状态码304的介绍
    在Controller上加OutputCache特性时,Controller下的所有的Action都将实现此特性。如果同时Action也有此特性时,以Action为标准,Action的粒度更精细。
     
    Outputcache特性中可以加上一些参数,主要有这些
    Outputcache重要的参数
    int Durrtion 获取或设置缓存持续时间(以秒为单位)
    bool NoStore 是否存储缓存,默认是false,当为true时http状态码就会变成200
    string VaryByParam  获取或设置参数变化的值。不同的参数都会被缓存不同的文档,多个参数用逗号隔开,none、*(空、所有)
    string CacheProfile 获取或设置缓存配置文件名称,也就是说在配置文件中设置缓存
    string VaryByCustom 获取或设置基于自定义项变化的值,自定义任何输出缓存的文字,比较常用
     Location 枚举值 None不缓存,Server缓存在服务器端,Client缓存在浏览器,Any在浏览器、代理服务器、web服务器
    string sqlDependency 获取或设置 SQL 依赖项,根据数据库的变化更新缓存
       
    对于这些参数如何使用我就写几个例子,看看效果吧。

    1.输出缓存CacheProfile使用配置文件设置缓存

    这种方式便于统一配置,当然也可以设置参数duration、location 、varybyparam等。我们需要在system.web 节点下加入这些
    <!---CacheProfile配置文件中设置缓存-->
    <caching>
      <outputCacheSettings>
        <outputCacheProfiles>
          <add name="exampleCacheProfile" duration="20" location="Any" enabled="true"/>
        </outputCacheProfiles>
      </outputCacheSettings>
    </caching>
    <!---CacheProfile配置文件中设置缓存end-->
    其实作用和效果还是一样,无非就是方便点,统一的配置参数都直接写webconfig文件里面。当然你也可以在Controller中写。看效果吧

    2.输出缓存VarByParam参数的使用

    简单点来说就是根据不同的参数值生成缓存。代码是这样的
    [OutputCache(Duration =20,VaryByParam ="type,page")]
    public ActionResult ExampleVaryByParam(string type,int page)
    {
        ViewBag.type = type;
        ViewBag.page= page;
         return View();
    }
    通过页面上可以观察到,这是不符合缓存数据的更新的,在缓存持续的时间内,改变了参数值,但是Action并没有重新生成页面返回,但是浏览器的Http Status Code
    还是200 ,所以只用VarByParam参数这种缓存是没有做到缓存数据的更新,这我就纳闷了。知道的可以告诉我一下。
    但是如果只是设置一个参数的,当参数值发生变化时,缓存也发生变化。设置多个参数时直接用*表示,也是有缓存数据的更新的。

    3.输出缓存VarByCustom参数的使用

    输出缓存中VarBuCustome参数的主要作用是根据数据改变让客户端缓存过期并及时更新。
    主要用于自定义输出缓存要求的任意文本。如果赋值该属性值是browser,缓存将随浏览器名称和主要版本信息的不同而异。如果输入了自定义的字符串,则必须在应用程序的Global.asax文件中重写 Httpapplication GetVaryByCustomString方法。
    public override string GetVaryByCustomString(HttpContext context, string custom)
    {
        //custom 是Outputcache中的参数VaryByCustom参数值 ,VaryByCustome为*代指所有参数
        if (custom == "type")
        {
           return context.Request.AnonymousID; //返回的这个字符串会与当前Action的缓存比较,字符串不一致则更新缓存。
         }
         return base.GetVaryByCustomString(context, custom);
    }
    特性
    [OutputCache(VaryByCustom ="type",VaryByParam ="type",Duration =20)]
    public ActionResult ExampleVaryByCustom(string type)
    {
         ViewBag.type = type;
         return View();
    }
    通过观察实现的效果很明显:在缓存持续的时间内,type参数值没有改变时 status Code 还是304 ,参数值发生改变时则是200重新生成页面了。
    从这个即时更新的缓存来说已经达到要求了,当然这从业务上来说还是不够的。
    可以得出的缓存结果,整个更新缓存的机制是 发现参数值不同便重新生成视图,就可以做到缓存的更新(当然更深入的缓存机制我也不知道,欢迎批评)
     

    4.输出缓存SqlDependency的使用

    首先我们还是来学习一下如何启用数据库缓存依赖项。

    运行cmd命令: cd C:WindowsMicrosoft.NETFrameworkv4.0.30319

     运行相关命令: aspnet_regsql -S .  -U sa -P 123456  -ed -d 数据库名 -et -t 表名

    解释一下 

    注册:aspnet_regsql -S . -E -ed -d 数据库名 -et -t 表名
    删除:aspnet_regsql -S . -E -d 数据库名 -dt -t 表名
    取消数据库缓存依赖: aspnet_regsql -S . -E -dd 数据库名数据库名 
    列出已注册表:aspnet_regsql -S . -E -d 数据库名 -lt

    如图:

    现在我们已经开启数据库的缓存依赖,我们继续在webconfig这样配置。
    <!---CacheProfile配置文件中设置缓存-->
    <caching>   
    <!--缓存的数据库依赖-->
    <sqlCacheDependency>
    <databases>
    <add name="CacheDependencyProduct" connectionStringName="Conn" pollTime="1000"/>
    <!--name:配置sqlDependency会用到,connectionStringName:数据库连接字符串的名称,pollTime:监听数据库变化的间隔时间,以毫秒为单位。即每隔1秒钟去监听数据库中的表Product是否有变化-->
    </databases>
    </sqlCacheDependency>
    <outputCacheSettings>
    <outputCacheProfiles>
    <!--<add name="exampleCacheProfile" duration="100"  location="Any" enabled="true"/>-->
    <add name="exampleSqlDependency" duration="20"  location="Any" enabled="true" sqlDependency="CacheDependencyProduct:Product"/>
    <!--sqlDenpendency:数据依赖节点名称+冒号+数据库表名(区分大小写)-->
    </outputCacheProfiles>
    </outputCacheSettings>
    </caching> 
    <!---CacheProfile配置文件中设置缓存end-->

    当然还有数据库连接字符串,还是贴出来吧

    <code class="language-html">  <connectionStrings>  
    <!--<add name="DefaultConnection" connectionString="Data Source=(LocalDb)MSSQLLocalDB;AttachDbFilename=|DataDirectory|aspnet-webapiToken-20170209085002.mdf;Initial Catalog=aspnet-webapiToken-20170209085002;Integrated Security=True" providerName="System.Data.SqlClient" />-->  
    <add name="Conn" connectionString="server=.;database=Monitor;uid=sa;pwd=123456" providerName="System.Data.SqlClient"/>  
    </connectionStrings>

    为了看到效果可以在在视图中加个时间

    [OutputCache(CacheProfile = "exampleSqlDependency")]
    public ActionResult ExampleSqlDependency()
    {
          ViewBag.timeStr = DateTime.Now.ToString("yyyy年MM月dd日 HH时mm分ss秒");
          return View();
    
    }

    所实现的效果是:数据库的Product表数据没有任何变化时,20秒的缓存持续时间内,这个时间是不会变化的,也就是从浏览器缓存中去读取http Status Code 为304。

    当Product有数据变化时,这个时间刷新成当前时间,也就是Action从新生成了Html文档返回给浏览器。

    5.总结

    输出缓存在实际的应用中还是需要自己去体会。在业务逻辑的处理中才更能体会到缓存的重要性。当然数据缓存也很重要,应用非常广泛,所以还是有必要去掌握。写的不足的地方希望给个评论指点一二。

  • 相关阅读:
    [oracle]ORA-38707: Media recovery is not enabled.
    [ORACLE]oracle 如何解决高水平线问题
    [ORACLE]Oracle ASH报告生成和性能分析
    [ORACLE]oracle 表连接的几种方式
    [ORACLE] ORACLE 查看执行计划 的方式
    [ORACLE] ORACLE访问数据的方法
    [ORACLE]ORACLE19 client 安装
    [ORACLE]查看SQL绑定变量具体值 查看SQL绑定变量值
    [ORACLE]锁 enq: TX
    将通过find命令找到的文件拷贝到一个新的目录中
  • 原文地址:https://www.cnblogs.com/wangwust/p/9359312.html
Copyright © 2020-2023  润新知