zoukankan      html  css  js  c++  java
  • MVC

    1.使用输出缓存 (不灵活,问题比较多,不建议使用)

    /// <summary>
            /// datagrid列表
            /// </summary>
            /// <returns></returns>
            [OutputCache(Duration = 10)]
            [HttpPost]
            public ActionResult MenuItemList()
            {
                JsonResponse json = BLL.RB_MenuItemService.Service.GetMenuItem();
                string xjson = RBW.Common.Response.Return(json);
                return Content(xjson);
            }

    [OutputCache(Duration = 10)] 我们让他缓存10秒钟。

    • VaryByContentEncoding
      VaryByCustom
      VaryByHeader
      VaryByParam

    这四个参数的意思是,决定缓存中如何区分不同请求,就是说,哪些因素将决定使用还是不使用缓存。默认情况下,如果不做任何设置,那么在规定的时间内(我们称为缓存期间),所有用户,不管用什么方式来访问,都是直接读取缓存。

    VaryByParam,可以根据用户请求的参数来决定是否读取缓存。这个参数主要指的就是QueryString。例如

    如果我们缓存了http://localhost/Home/Index,那么用这个地址来访问的时候,规定时间内都是读取缓存。但如果用http://localhost/Home/Index?name=chenxizhang这样的地址过来访问,显然我们希望不要读取缓存,因为参数不一样了。要实现这样的需求,也就是说,希望根据name参数的不同缓存不同的数据。则可以设置VaryByParam=”name”。

    如果有多个参数的话,可以用逗号分开他们。例如 VaryByParam=”name,Id”

    2.使用缓存配置文件

    节点定义在system.web中

        <!--自定义缓存-->
        <caching>
          <outputCacheSettings>
            <outputCacheProfiles>
              <add name="CustomCache" duration="10" enabled="true" location="ServerAndClient" varyByParam="none"/>
            </outputCacheProfiles>
          </outputCacheSettings>
        </caching>
            [OutputCache(CacheProfile = "CustomCache")]
            public ActionResult About()
            {
    
            }

    3.使用缓存API

    通过上面的两步,我们了解到了使用OutputCache,并且结合CacheProfile,可以很好地实现灵活的缓存配置。但是有的时候,我们可能还希望对缓存控制得更加精细一些。因为OutputCache是对Action的缓存,不同的Action之间是不能共享数据的,假如某些数据,我们是在不同的Action之间共享的,那么,简单地采用OutputCache来做,就会导致对同一份数据,缓存多次的问题。

    所以,ASP.NET除了提供OutputCache这种基于声明的输出缓存设置之外,还允许我们在代码中,自己控制要对哪些数据进行缓存,并且提供了更多的选项。

    关于如何通过API的方式添加或者使用缓存,请参考

    http://msdn.microsoft.com/zh-cn/library/18c1wd61%28v=VS.80%29.aspx

    基本上就是使用HttpContext.Cache类型,可以完成所有的操作,而且足够灵活。

    值得一提的是,我知道不少公司在项目中都会采用一些ORM框架,某些ORM框架中也允许实现缓存。例如NHibernate就提供了较为丰富的缓存功能,大致可以参考一下 http://www.cnblogs.com/RicCC/archive/2009/12/28/nhibernate-cache-internals.html

    需要注意的是,微软自己提供的Entity Framework本身并没有包含缓存的功能。

    这里仍然要特别提醒一下,使用这种基于API的缓存方案,需要仔细推敲每一层缓存的设置是否合理,以及更新等问题。

    4.使用缓存依赖

    很早之前,在ASP.NET中设计缓存的时候,我们就可以使用缓存依赖的技术。关于缓存依赖,详细的信息请参考 http://msdn.microsoft.com/zh-cn/library/ms178604.aspx

    实际上,这个技术确实很有用,ASP.NET默认提供了一个SqlCacheDependency,可以通过配置,连接SQL Server数据库,当数据库的表发生变化的时候,会通知到ASP.NET,该缓存就会失效。

    值得一提的是,不管是采用OutputCache这样的声明式的缓存方式,还是采用缓存API的方式,都可以使用到缓存依赖。而且使用缓存API的话,除了使用SqlCacheDependency之外,还可以使用标准的CacheDependency对象,实现对文件的依赖。

    http://msdn.microsoft.com/zh-cn/library/system.web.caching.cachedependency%28v=VS.80%29.aspx

    5.分布式缓存

    上面提到的手段都很不错,如果应用系统不是很庞大的话,也够用了。需要注意的是,上面所提到的缓存手段,都是在Web服务器本地内存中进行缓存,这种做法的问题在于,如果我们需要做负载均衡(一般就会有多台服务器)的时候,就不可能在多台服务器之间共享到这些缓存。正因为如此,分布式缓存的概念就应运而生了。

    谈到分布式缓存,目前比较受到大家认可的一个开源框架是 memcached。顾名思义,它仍然使用的是内存的缓存,只不过,它天生就是基于分布式的,它的访问都是直接通过tcp的方式,所以可以访问远程服务器,也可以多台Web服务器访问同一台缓存服务器。

    关于memcached以及它在.NET中的使用,之前有一个朋友有写过一个介绍,可以参考使用一下

    http://www.cnblogs.com/zjneter/archive/2007/07/19/822780.html

    需要注意的是,分布式缓存不是为了来提高性能的(这可能是一个误区),并且可以肯定的是,它的速度一定会被本地慢一些。如果你的应用只有一台服务器就能满足要求,你就没有必要使用memcached。它的最大好处就是跨服务器,跨应用共享缓存。

    参考:陈希章@中国
    http://www.cnblogs.com/chenxizhang/archive/2011/12/14/2288062.html

  • 相关阅读:
    django之创建第3个项目:编写第一个模板文件
    django之创建第2个项目
    django之创建第1个项目并查看网页效果
    python 第三库卸载办法
    django之环境变量配置
    数据库中的函数研究
    数据库中的 Date 函数研究
    数据库查询语句研究
    tablib.Dataset()操作exl类型数据之“类方法”研究
    tablib把数据导出为Excel、JSON、CSV等格式的Py库(写入数据并导出exl)
  • 原文地址:https://www.cnblogs.com/tangge/p/4229050.html
Copyright © 2011-2022 走看看