zoukankan      html  css  js  c++  java
  • 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。

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

  • 相关阅读:
    Spring Cloud Hystrix Dashboard的使用 5.1.3
    Spring Cloud Hystrix 服务容错保护 5.1
    Spring Cloud Ribbon 客户端负载均衡 4.3
    Spring Cloud 如何实现服务间的调用 4.2.3
    hadoop3.1集成yarn ha
    hadoop3.1 hdfs的api使用
    hadoop3.1 ha高可用部署
    hadoop3.1 分布式集群部署
    hadoop3.1伪分布式部署
    KVM(八)使用 libvirt 迁移 QEMU/KVM 虚机和 Nova 虚机
  • 原文地址:https://www.cnblogs.com/alunchen/p/6255736.html
Copyright © 2011-2022 走看看