• 服务器缓存


    缓存可以在客户端和服务器中做,要是之间还有代理,代理也可能对响应进行缓存。
    代理是将客户端和服务器连接在一起,作为中间人角色,可以将客户端请求响应的内容进行缓存,

    在下次客户端缓存时,代理直接返回缓存结果,提高性能。
    代理缓存控制是在http头信息中cache-Control设置,当设成private时,代理不会进行缓存,

    当设置为public时,代理可以进行缓存。我们可以用编程方式:

    void SetPublicCache()
    {
        TimeSpan ts = TimeSpan.FromSeconds(60);
        this.Response.Cache.SetMaxage(ts);//设置过期时间
        this.Response.Cache.SetNoServerCaching();//关闭服务器输出缓存
    }

    还可以使用OutPutCache命令:

    <%@outputcache Duration="60" Location="DownStream" VaryByParam="None"%>

    服务器缓存:包含内核缓存,IIS缓存,ASP.NET输出缓存,ASP.NET对象缓存,数据库缓存等
    windows内核缓存:当客户端http请求到达服务器,肯定是先进windows内核模块,

    然后进行一些处理,把请求委托给IIS,IIS在委托给ASP.NET应用程序,这是大致的一个过程。
    windows包含一个内核模块的HTTP驱动,名为http.sys,HTTP协议在windows内核中提供了支持,提高了性能和灵活性。内核HTTP缓存默认为静态文件打开,对动态文件默认关闭。
    可以启动动态内容的缓存:

    <%@outputcache Duration="60" VaryByParam="None"%>

    这句话也会同时启动ASPNET输出缓存。
    编程方式启动:

    void SetPublicCache()
    {
        TimeSpan ts = TimeSpan.FromSeconds(60);
        this.Response.Cache.SetMaxage(ts);//设置过期时间
        this.Response.Cache.SetCacheability(HttpCacheability.Public);
    }

    内核缓存,会占用内核内存,是稀有资源,在120秒内没有命中缓存,就会被移除。
    在内核缓存下面的是IIS输出缓存,可以根据查询字符串进行缓存,这是内核缓存不具备的。
    再下面就是ASP.NET输出缓存:独立于IIS输出缓存,还可以根据参数改变输出,设置方式和上面是一样的,ASP.NET输出缓存还可以使用在用户控件之上,而页面可以不设置缓存。
    关闭方法:this.Response.Cache.SetNoServerCaching();//关闭服务器输出缓存
    还可以从输出缓存中显示指定移除项:

    HttpResponse.RemoveOutPutCacheItem("/pages/default.aspx");

    ASP.NET对象缓存

    HttpContext.Application

    可以使用静态变量缓存对象,但是是常住内容,占用内存。还可以使用HttpContext.Application对象,使用它可以实现延迟初始化,有利于整体性能。例:

    HttpApplicationState app = this.Context.Application;
    string myvalue = null;
    app.Lock();
    try
    {
        myvalue = (string)app["key"];
        if(myvalue == null)
        {
            myvalue = "value";
            app["key"] = myvalue;
        }
    }
    finally
    {
        app.unlock();
    }

    因为这种方式变量是多个线程可以访问的,保证一致性状态,对象本身实现的lock方法,可以运用。

    HttpContext.Items

    缓存只在当前请求中使用的对象
    应用HttpContext.Items缓存当前请求中需要的对象,请求结束后会销毁:

    this.Context.Items["key"] = "value";

    使用场景是用户控件之间共享数据,httpModule与页面之间交互机制。

    HttpContext.Cache

    可以使用HttpContext.Cache缓存不止一个用户需要且由多个页面请求的对象。
    使用:

    public Static Object lockObject = new object();
    lock(lockObject)
    {
        if(this.cache["key"] == null)
        {
            this.cache["key"] = "value";
        }
    }

    还可以指定运行时保留的时间

    if(this.Cache["key"] == null)
    {
        this.Cache.Add("key","value",null,DateTime.Now.AddSeconds(60)

            ,CacheItemPriority.High,null);//指定时间,是否滑动过期,等级是否高
    }

    还可以让缓存依赖于文件:

    public class XmlDepend
    {
        public static object lockobject = new object();
        public static XmlDocument MyDocument(string path)
        {
            string key = "mydoc:"+path;
            Cache cache = HttpContext.Current.Cache;
            lock(lockobject)
            {
                xmlDocument doc = (XmlDocument)Cache[key];
                if(doc==null)
                {
                    doc = new XmlDocument();
                    doc.Load(path);
                    CacheDependency cd = new CacheDependency(path);
                    cache.Insert(key,doc,cd);
                }
                return doc;
            }
        }
    }

    这会将一个xml文件路径给方法,用它构造一个缓存键,如果xmlDocument仍然在缓存中则返回它,否则就从硬盘加载,并创建缓存依赖,当xml文件被修改时,它会通知,并移除xmldocument的存环对象。



  • 相关阅读:
    BAT脚本打印空行的使用方法
    Shell脚本关于屏幕输出的字符进行颜色控制的问题
    shell脚本中切换用户执行相应的命令或者shell脚本的方法
    Linux下执行的java命令重定向到文件中的方法
    解决Firefox浏览器每次打开都弹出导入向导的问题
    解决Ruby在IE11中报Unable to get browser (Selenium::WebDriver::Error::NoSuchWindowError)的错误
    6月28日 Django form组件 和 modelform组件
    6月27日 ajax
    6月25日 Django 分页 cookie、session
    6月26日 Django 中间件
  • 原文地址:https://www.cnblogs.com/lmfeng/p/2791048.html
Copyright © 2020-2023  润新知