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

  • 相关阅读:
    LeetCode 230. Kth Smallest Element in a BST
    LeetCode 114. Flatten Binary Tree to Linked List
    LeetCode 222. Count Complete Tree Nodes
    LeetCode 129. Sum Root to Leaf Numbers
    LeetCode 113. Path Sum II
    LeetCode 257. Binary Tree Paths
    Java Convert String & Int
    Java Annotations
    LeetCode 236. Lowest Common Ancestor of a Binary Tree
    LeetCode 235. Lowest Common Ancestor of a Binary Search Tree
  • 原文地址:https://www.cnblogs.com/tangge/p/4229050.html
Copyright © 2011-2022 走看看