• ASP.NET缓存了解


    资料整理自李天平博客和MSDN

    ASP.NET 提供三种主要形式的缓存:页面级输出缓存、用户控件级输出缓存(或称为片段缓存)和缓存 API。输出缓存和片段缓存的优点是非常易于实现,在大多数情况下,使用这两种缓存就足够了。而缓存 API 则提供了额外的灵活性(实际上是相当大的灵活性),可用于在应用程序的每一层利用缓存。

    页面输出缓存:

    页面输出缓存是最为简单的缓存机制,该机制将整个ASP.NET页面内容保存在服务器内存中。当用户请求该页面时,系统从内存中输出相关数据,直到缓存数据过期。在这个过程中,缓存内容直接发送给用户,而不必再次经过页面处理生命周期。

    通常情况下,页面输出缓存对于那些包含不需要经常修改内容的,但需要大量处理才能编译完成的页面特别有用。需要读者注意的是,页面输出缓存是将页面全部内容都保存在内存中,并用于完成客户端请求。[李]

    页面输出缓存只是在内存中保留为响应请求而发送的 HTML 的副本。其后再有请求时将提供缓存的输出,直到缓存到期,这样,性能有可能得到很大的提高(取决于需要多少开销来创建原始页面输出 - 发送缓存的输出总是很快,并且比较稳定)[MSDN]

    在ASP.NET中页面缓存的使用方法非常的简单,只需要在aspx页的顶部加这样一句声明即可:

    如同其他页面指令一样,该指令应该出现在 ASPX 页面的顶部,即在任何输出之前。它支持五个属性(或参数),其中两个是必需的。

     

    <%@ OutputCache Duration="60" VaryByParam="none" %> 

    Duration

    必需属性。页面应该被缓存的时间,以秒为单位。必须是正整数。

    Location

    指定应该对输出进行缓存的位置。如果要指定该参数,则必须是下列选项之一:Any、Client、Downstream、None、Server 或 ServerAndClient。

    VaryByParam

    必需属性。Request 中变量的名称,这些变量名应该产生单独的缓存条目。"none" 表示没有变动。"*" 可用于为每个不同的变量数组创建新的缓存条目。变量之间用 ";" 进行分隔。

    VaryByHeader

    基于指定的标头中的变动改变缓存条目。

    VaryByCustom

    允许在 global.asax 中指定自定义变动(例如,"Browser")。

    利用必需的 Duration和 VaryByParam 选项的组合可以处理大多数情况。例如,如果您的产品目录允许用户基于categoryID 和页变量查看目录页,您可以用参数值为 "categoryID;page" 的 VaryByParam 将产品目录缓存一段时间(如果产品不是随时都在改变,一小时还是可以接受的,因此,持续时间是 3600 秒)。这将为每个种类的每个目录页创建单独的缓存条目。每个条目从其第一个请求算起将维持一个小时。

    VaryByHeader 和 VaryByCustom 主要用于根据访问页面的客户端对页面的外观或内容进行自定义。同一个 URL 可能需要同时为浏览器和移动电话客户端呈现输出,因此,需要针对不同的客户端缓存不同的内容版本。或者,页面有可能已经针对 IE 进行了优化,但需要能针对Netscape 或 Opera 完全降低优化(而不仅仅是破坏页面)。后一个例子非常普遍,我们将提供一个说明如何实现此目标的示例:

    示例:VaryByCustom用于支持浏览器自定义

    为了使每个浏览器都具有单独的缓存条目,VaryByCustom 的值可以设置为 "browser"。此功能已经内置在缓存模块中,并且将针对每个浏览器名称和主要版本插入单独的页面缓存版本。

    <%@ OutputCache Duration="60"VaryByParam="None" VaryByCustom="browser"  %>

    CacheProfile

    用于调用Web.config配置文件中设置的缓存时间。这是可选属性,默认值为空字符("")。

    <system.web>

        <caching>

            <outputCacheSettings>

                <outputCacheProfiles>

                    <add name="CacheTest" duration="50" />

                </outputCacheProfiles>

            </outputCacheSettings>

    </caching>

    </system.web>

    页面中调用时:

    <%@ OutputCacheCacheProfile="CacheTest" VaryByParam="none" %>

    如果每个页面的缓存时间相同,则不需要每个页面设置,而是通过统一一个地方控制,这样就可以更好的统一控制所有页面的缓存时间。如果想改变缓存时间,只需要改一下web.config的配置信息即可,而不用每个页面去修改。

    VaryByControl

    通过用户控件文件中包含的服务器控件来改变缓存(值是控件ID,多控件用分号隔开)。

    在 ASP.NET 页和用户控件上使用 @ OutputCache 指令时,需要该属性或 VaryByParam 属性。

    缓存API:

    代码
    /// <summary>

    /// 缓存操作类

    /// </summary>

    public class DataCache

    {

    /// <summary>

    /// 获取当前应用程序指定CacheKey的Cache值

    /// </summary>

    /// <param name="CacheKey"></param>

    /// <returns></returns>

    public static object GetCache(string CacheKey)

    {

    System.Web.Caching.Cache objCache
    = HttpRuntime.Cache;

    return objCache[CacheKey];

    }



    /// <summary>

    /// 设置当前应用程序指定CacheKey的Cache值

    /// </summary>

    /// <param name="CacheKey"></param>

    /// <param name="objObject"></param>

    public static void SetCache(string CacheKey, object objObject)

    {

    System.Web.Caching.Cache objCache
    = HttpRuntime.Cache;

    objCache.Insert(CacheKey, objObject);

    }

    /// <summary>

    /// 设置当前应用程序指定CacheKey的Cache值

    /// </summary>

    /// <param name="CacheKey"></param>

    /// <param name="objObject"></param>

    public static void SetCache(string CacheKey, object objObject, DateTimeabsoluteExpiration, TimeSpan slidingExpiration)

    {

    System.Web.Caching.Cache objCache
    = HttpRuntime.Cache;

    objCache.Insert(CacheKey, objObject,
    null, absoluteExpiration,slidingExpiration);

    }

    }

    Cache对象有两个方法Insert()方法和Add()方法,它们灵活性更高。它们的用法近似,但稍有不同:
    Insert()方法用于覆盖ASP.NET缓存中现有的缓存项。
    Add()方法只用于在ASP.NET缓存中添加新的缓存项(如果用它覆盖现有的缓存项,则会失败)。

    在缓存某一项时,可以指定它的相关性,告诉ASP.NET该缓存项在缓存中一直保留到某个事件发生时为止。
    相关性值含义CacheDependency
    允许指定一个文件或缓存键。如果文件发生变化,对象就被删除。如果缓存键发生变化,对象也被删除。

    System.Web.Caching.Cache.Insert(…..)

    第一个参数是引用缓存对象的键,第二个参数是要缓存的对象。第三个参数是null(表明没有相关性)。
    第四和第五个参数是绝对的过期时间和弹性的 过期时间。这里,我们指定缓存应在当前年份的最后一天过期(dt)。我们想指定没有弹性的过期时间,所以第五个参数使用TimeSpan.Zero。第六 个参数使用System.Web.Caching.CacheItemPriority枚举中的一个值,把优先级设为Normal。

  • 相关阅读:
    PHP中使用cURL实现Get和Post请求的方法
    详解回调函数——以JS为例解读异步、回调和EventLoop
    JavaScript中变量提升------Hoisting
    js 变量提升(JavaScript Scoping and Hoisting)
    js 如何判断数据是数据还是对象
    Bootstrap Modal 垂直方向加滚动条
    Bootstrap Affix(附加导航(Affix)插件的用法)
    Vue 源码解析:深入响应式原理(上)
    ceph API之PHP的S3-SDK包的泛域名解析问题
    ceph API之PHP的客户端连接
  • 原文地址:https://www.cnblogs.com/huaxiaoyao/p/1808968.html
Copyright © 2020-2023  润新知