• .net缓存机制


    1 web应用程序,有的称为状态管理,有的称为就是缓存管理,缓存机制。

    2 分为服务器端缓存和客户端缓存。

    3  客户端缓存:

    3.1 Cookies:当客户端每次发送请求时都会将它发送到服务端,服务端响应时也会把它发回到客户端。因为它限制了字节数(4096个字节),所以它只能缓存比较小的数据。它可以使用过期策略使它在一段特定的时间之后失效

    if (this.Request.Cookies["UserName"] == null) 
    { 
        this.Response.Cookies.Add(new HttpCookie("UserName",  "aaa")); 
    } 
    else 
    { 
        this.Response.Write(this.Request.Cookies["UserName"].Value); 
    }
    

     3.2 ViewState:和页面相关的数据和控件都是存储在ViewState,ViewState在ASP.NET是隐藏控件的内部实现.功能类似Hidden fields

    3.3 页面缓存浏览器缓存和代理缓存,两者设置也很方便,Cache-Control,设置为public就行了,private就只缓存在浏览器

    <%@ OutputCache Duration="1800" VaryByParam="*" %>

    <%@ OutputCache Duration="3600" VaryByParam="id" %>

    在ASP.NET中,要使页面每次访问都必须从服务器端重新加载,而不是从IE缓存中直接读取上次的暂存页,如下实现:

    protected void Page_Load(object sender, EventArgs e)
        {
            Response.Buffer = true;
            Response.ExpiresAbsolute = DateTime.Now.AddMinutes(-1);
            Response.Expires = 0;
            Response.CacheControl = "no-cache";
        }

    代理缓存的问题,主要出现在三个方面:
    1.安全
    2.地区问题
    3.内容更新问题

    首先,对于安全问题,这是最大的问题:因为代理会把根据URL,把整个页面的数据缓存起来,其中就包括了响应头,那么就包含了cookie信息。问题就在 这里啦,如果用户A登录之后,代理缓存了页面的响应,那么用户B在此请求相同的页面的时候,那么整个响应就会给B了,这个时候,用户B就可以以A的身份进 去瞎搞了。
    对于这个问题,没有办法解决,但是有办法避免:把一些不需要用户登录就可以访问的页面,特别是那些静态的内容的页面,可以设置代理缓存;涉及到用户验证才能看的页面,不要设置了。

    其次,就是地区问题,
    因为代理缓存了整个页面,而且是根据URL来匹配的,如果咱们中国人去访问一个页面,例如www.agilesharp.com/blog/12344,这个时候,代理缓存就把这个中文的页面内容缓存,如果我们的站点是支持多语言的,那么,此时,如果美国人去访问了同一个URL,那么这个时候,或许,请求不会提交给我们的服务器,代理就会把中文的页面内容给老美,那叫一个郁闷,是吧。

    怎么办?呵呵,方法虽然鲜为人知,但是依然简单。
    设置头信息:Accept-Language
    在发送中文响应的时候,设置为:Accept-Language: zh-cn,那么代理缓存就会缓存这个版本的内容
    如果是请求的英文,那么,老美的浏览器发送的请求的这个Accept-Language的信息就是 en-US,代理一看这样版本的内容没有,那么就会把请求交给我们的服务器了。

    最后的结果就是代理中缓存了同一个页面的不同版本的内容。

    内容更新问题:因为代理缓存了页面的所有数据,包括图片,js等等,那么即使我们的页面中的图片等更新了,但是客户端是无法知道的,除非缓存的之间过期了,

    aa.js?v=2.1

    bb.css?v=1.1


    4 服务器端缓存:Session,Application就不说了,主要常用的有两种:

    4.1:.net缓存:(宿主缓存)在.Net Framework中,应用程序缓存通过System.Web.Caching.Cache类实现,

     当IIS回收频繁的时候,.net缓存会丢失,导致还是频繁的访问数据库,影响性能,所以要和MemCache缓存结合使用。

     关于net缓存和IIS的关系,缓存占用内存达到一定值,所用的资源就会被应用程序池回收,

    参考http://www.cnblogs.com/yanyangtian/archive/2012/05/02/2478659.html

    4.2:MemCache缓存:(内核缓存)首先要安装MemCache,运行,任务管理器里面会看到MemCache的进程。然后使用。目前主要用来缓存数据库的数据。

    memcached中保存的数据都存储在memcached内置的内存存储空间中。 由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失

    这种缓存是一种分布式的,也就是可以允许不同主机上的多个用户同时访问这个缓存系统,这种方法不仅解决了共享内存只能是单机的弊端,同时也解决了数据库检 索的压力,最大的优点是提高了访问获取数据的速度,Memcached用于在动态应用中减少数据库负载,提升访问速度,但是用来加速Web应用、降低数据 库负载时比较多。Memcached也完全可以用到其他地方,比如分布式数据库,分布式计算等领域

    web.config配置如下:

       <!--MemCache配置(缓存池名称)-->
      <add key="MemPoolName" value="poolName" />
      <!--MemCache配置(服务器列表)-->
      <add key="MemServer" value="17.0.0.0:11211" />
      <!--MemCache配置(是否开启 1开启)-->
      <add key="MemEnabledCache" value="1" />

     

     

     

  • 相关阅读:
    假丶依赖注入
    .NET Core 傻瓜式CSRedisCore缓存
    .NET Core MD5加密 32位和16位
    数据库所对应的函数
    使用通配符进行过滤
    WHERE 子句操作符
    不同的数据库查询行数的方式
    第一课了解SQL
    微服务架构综述
    三层应用与单块架构
  • 原文地址:https://www.cnblogs.com/judy0605/p/2727681.html
Copyright © 2020-2023  润新知