zoukankan      html  css  js  c++  java
  • Net缓存

    由于工作的需要,最近对.net缓存做了相关了解和学习。做以下分类:

    • 客户端缓存
    • 第三方的缓存
    • 服务器缓存

    客户端缓存

    客户端缓存主要是指浏览器帮我们缓存一些页面组件包括脚本,样式,图片等等,由于客户端缓存的原因,可以减少HTTP请求的次数,相关文章可以参阅性能探索(1-6)

    第三方缓存

    目前主要了解过memcached,它是通过在内存中开辟一块区域来维护一个hash表以加快页面的访问速度,和数据库是相对独立的。

    和asp.net本是的缓存机制相比,memcached是一个分布式缓存系统,任何web服务器都能更新或删除缓存项,并且其他所有其他的服务器都能在下次访问时检测到这些更新。memcached已经提供了asp.net的客户端。

    相关参考文章

    本文主要总结asp.net的服务器缓存

    • 传统缓存(将数据放入Application或Session等变量中)
    • 页面输出缓存
    • 利用asp.net提高的System.Web.Caching实现缓存
    • 缓存依赖

    服务器缓存---传统缓存

    对于一些在系统中被所有用户共享,可以重复,并且变动很小的数据我们可以将其放入Application或者Session中去,比如系统菜单数据,可以在Application_Start事件中将数据放入Application中。

    void Application_Start(object sender, EventArgs e)

    {

          Application[“SysMenu”]=MenuUtility.RetrieveMenuData();

    }

    这样以后就对整个系统,所有用户共享,完全不要再去访问DB:

    if(Application[“SysMenu”]!=null)//已经在缓存中,无需读取DB

    {

         menuData=Application[“SysMenu”] as DataSet;

    }

    else

    {

    menuData=MenuUtility.RetrieveMenuData();//缓存中不存在

    }

    服务器缓存---页面输出缓存

    这是.net 中最简单的缓存机制,该机制是将使用了页面输出缓存的页面存储在服务器内存中,当用户请求该页面时,直接从内存中输出页面,而无需再次经过页面生命周期(知道缓存数据过期)。

    页面输出缓存应该用在那些不需要经常修改,但是需要经过大量的处理才能完成页面上面,其使用非常简单,只需在aspx页面顶部添加声明:

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

    它主要有一些参数,Duration,VaryByParam,VaryByConyrol等

    • Duration,这是必选属性,没有会爆出运行时错误,指缓存的时间(秒),在上面的例子中是60(60秒后缓存失效)。
    • VaryByParam,是指页面根据POST或GET发送的名称/值对来更新缓存的内容,多个参数使用逗号隔开,如果不希望根据如何参数更新缓存那么将其设置为none(上例),如果系统通过所有的参数值的改变来更新缓存,将其设置为*. 
    • 例如对于http://localhost/test.aspx?p=1,可以在test.aspx中设置<%@ OutputCache  Duration="60" VaryByParam="p" %>,当p=1时,60秒内数据会缓存,当p=2时又会执行后台代码更新缓存内容。
    • VaryByConyrol,是指通过当前页面中服务器控件来改变缓存(值是控件的ID,多个控件用分号隔开)

    还有很多参数比如CacheProfle,Location等等:

    <%@ OutputCache Duration="#ofseconds"  
     Location="Any | Client | Downstream | Server | None | ServerAndClient "   
    Shared="True | False"   
    VaryByControl="controlname"   
    VaryByCustom="browser | customstring"  
     VaryByHeader="headers"   VaryByParam="parametername"    
    CacheProfile="cache profile name | ''"  
    NoStore="true | false"   
    SqlDependency="database/table name pair | CommandNotification"%>

    具体可以查阅msdn .

    服务器缓存---利用asp.net提供的System.Web.Caching实现缓存

    System.Web.Caching.Cache类是一个字典,可以存储任意对象,提高了失效功能,可以移除添加等,一个小例子说明一下。

    缓存工具类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    public class CacheUtility
    {
        public CacheUtility(){}
     
        public static void SetCache(string key, object value)
        {
            HttpRuntime.Cache.Insert(key, value);
        }
     
        public static void SetCache(string key, object value, DateTime absoluteExpiration, TimeSpan slidingExpiration)
        {
            HttpRuntime.Cache.Insert(key, value, null, absoluteExpiration, slidingExpiration);
        }
     
        public static object RetrieveCacheValueByKey(string key)
        {
            return HttpRuntime.Cache[key];
        }
    }

    缓存使用方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    protected void Page_Load(object sender, EventArgs e)
        {
            string key = "key";
            object obj = CacheUtility.RetrieveCacheValueByKey(key);
            if (obj == null)
            {
                obj = DateTime.Now;
     
                CacheUtility.SetCache(key, obj, DateTime.Now.AddMinutes(1), TimeSpan.Zero);
            }
     
            object testObj = obj;
        }

    这些方法都能解决数据缓存问题,但是有一个很大的弊端,就是如果数据发生了变化,而缓存中的数据已经是过期的数据,只有等缓存过期后才能获取到最新的数据,这样会早晨数据的不一致,有些可能会早晨很严重的后果,比如说股票数据,怎么办?缓存依赖出场。

    服务器缓存---缓存依赖

    在上面出的代码HttpRuntime.Cache.Insert(key, value, null, absoluteExpiration, slidingExpiration);这里面有个参数是null,这个参数就是缓存依赖参数。

    缓存依赖的类为System.Web.Caching.CacheDependency.

    .net缓存依赖主要分为为两种:

    • 文件缓存依赖
    • 数据库缓存依赖

    服务器缓存---文件缓存依赖

    该策略让缓存依赖于一个指定的文件,通过文件的更新日期来清楚缓存,加入某些数据是来自于xml文件,那么完全可以将该xml数据的缓存依赖于该xml文件,只要xml文件改变,则自动清空依赖其的数据缓存。例子:

    重构一个SetCache用于设置文件依赖:

    1
    2
    3
    4
    5
    6
    public static void SetCache(string key, object value, System.Web.Caching.CacheDependency cacheDependency)
       {
           HttpRuntime.Cache.Insert(key, value, cacheDependency,
               System.Web.Caching.Cache.NoAbsoluteExpiration,
               System.Web.Caching.Cache.NoSlidingExpiration);
       }

    设置文件依赖,并设置缓存

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    protected void Page_Load(object sender, EventArgs e)
       {
           string key = "key";
           object obj = CacheUtility.RetrieveCacheValueByKey(key);
           if (obj == null)
           {
               obj = DateTime.Now;
               System.Web.Caching.CacheDependency cacheDependency = new System.Web.Caching.CacheDependency("C:\\dependencyText.txt");
               CacheUtility.SetCache(key, obj, cacheDependency);
           }
     
           object testObj = obj;
       }

    这样当我们改变dependencyText.txt的内容时,缓存就会自动更新,这种方式非常适合于读取配置文件等一些xml数据。

    服务器缓存---数据库缓存依赖

    其实我们服务器的大多性能损耗还是花在查询数据库的时候,所以对于数据库的缓存是特别重要的,如果我们的缓存能够依赖于数据库数据的变化就会更好,其实.net已经实现了这个机制:System.Web.Caching.SqlCacheDependency,该类就是.net专门为数据库缓存依赖而设计的,它继承自CacheDependency。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public sealed class SqlCacheDependency : CacheDependency
      {
          public SqlCacheDependency(SqlCommand sqlCmd);
        
          public SqlCacheDependency(string databaseEntryName, string tableName);
     
          public static CacheDependency CreateOutputCacheDependency(string dependency);
          protected override void DependencyDispose();
         
          public override string GetUniqueID();
      }

    对于数据库缓存依赖需要对数据库和网站做一些配置,petshop4.0讲非常的清楚,本人在学习之余转载文章一篇,可谓是相当出彩,本文在此就不再多说,具体可以点此查看

  • 相关阅读:
    什么是em?
    数据结构与算法:快速排序
    flex中flexshrink的理解
    前端的padding是参照父元素的宽度还是高度?
    子元素的border不能通过百分比设置的
    数据库去重的简易方法
    windows2003 iis6.0站点打不开,找不到服务器或 DNS 错误。
    常用WebServices返回数据的4种方法比较
    手机身份证IP地址开放接口(很实用哦)
    从创业失败中学到的七条教训
  • 原文地址:https://www.cnblogs.com/MyFlora/p/2496682.html
Copyright © 2011-2022 走看看