由于工作的需要,最近对.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讲非常的清楚,本人在学习之余转载文章一篇,可谓是相当出彩,本文在此就不再多说,具体可以点此查看

asp.net缓存(转载)的更多相关文章

  1. [转]C#基础回顾:Asp.net 缓存

    本文转自http://www.cnblogs.com/stg609/archive/2009/03/22/1418992.html 缓存的作用      你买电脑的时候,是否会在意CPU的二级缓存?是 ...

  2. asp.net—缓存

    1.页面缓存 要实现页面输出缓存,只要将一条 OutputCache 指令添加到页面即可. <%@ OutputCache CacheProfile=" " NoStore= ...

  3. Asp.Net缓存(2)

    缓存页的多个版本 ASP.NET 允许在输出缓存中缓存同一页的多个版本.输出缓存可能会因下列因素而异: 初始请求 (HTTP GET) 中的查询字符串. 回发时传递的控制值(HTTP POST 值). ...

  4. Asp.Net缓存(1)

    知其根本,方能应用.MSDN上的缓存讲解.先看原来讲解. Asp.Net缓存概述 通常,应用程序可以将那些频繁访问的数据,以及那些需要大量处理时间来创建的数据存储在内存中,从而提高性能. 在这些情况下 ...

  5. ASP.NET缓存策略经验谈

    要提升ASP.NET应用程序的性能,最简单.最有效的方式就是使用内建的缓存引擎.虽然也能构建自己的缓存,但由于缓存引擎已提供了如此多的功能,所以完全不必如此麻烦.在很大程度上,ASP.NET开发者在W ...

  6. (转)ASP.NET缓存全解析6:数据库缓存依赖

    ASP.NET缓存全解析文章索引 ASP.NET缓存全解析1:缓存的概述 ASP.NET缓存全解析2:页面输出缓存 ASP.NET缓存全解析3:页面局部缓存 ASP.NET缓存全解析4:应用程序数据缓 ...

  7. ASP.NET缓存 Cache

    缓存介绍 如果每次进入页面的时候都查询数据库生成页面内容的话,如果访问量非常大,则网站性能会非常差,而如果只有第一次访问的时候才查询数据库生成页面内容,以后都直接输出内容,则能提高系统性能,这样无论多 ...

  8. 概述ASP.NET缓存机制

    PetShop之ASP.NET缓存机制 如果对微型计算机硬件系统有足够的了解,那么我们对于Cache这个名词一定是耳熟能详的.在CPU以及主板的芯片中,都引入了这种名为高速缓冲存储器(Cache)的技 ...

  9. (转)ASP.NET缓存概念及其应用浅析

    ASP.NET缓存概念及其应用浅析 ASP.NET缓存是什么呢?ASP.NET缓存有什么样子的特点呢?本文就向你详细介绍ASP.NET缓存的相关情况. ASP.NET缓存概念是什么呢?通常,应用程序可 ...

随机推荐

  1. C++中避免内存泄露常见的解决方式

    常见内存泄露及解决方式-选自ood启发录 new/delete, array new/arrray delete匹配 case 1: 在类的构造函数与析构函数中没有匹配地调用 new/delete! ...

  2. 如何利用【百度地图API】进行定位?非GPS定位

    原文:如何利用[百度地图API]进行定位?非GPS定位 如果你可以上网,如果你有火狐浏览器,那么恭喜你.你能很容易使用以下代码进行定位! ------------------------------- ...

  3. MongoDb的副本集搭建教程(个人操作笔记)

    很多公司都在用MongoDb ,一直没有时间研究,最近好好的整了一下,做下笔记,直接上操作步骤,关于Mongodb的理论知识可以搜索其他资料,也可以联系我索取 mongoDB官方已经不建议使用主从模式 ...

  4. MVC应用程序使用Web Services(asmx)

    原文:MVC应用程序使用Web Services(asmx) 这次,我们练习MVC应用程序中,应用web service.先在MVC应用程序中创建一个目录Services,将用来存储Service.a ...

  5. leetcode先刷_Unique Binary Search Trees II

    可能没想到,人的简单方法,关于质询的问题提出做. 如何把产生出来的所有的树木?所使用的方法当然是递归,但是有一个致命的问题,假设根节点,然后做一个递归,所以这是非常多的公共树木的根,结果肯定是一团糟. ...

  6. ASP.NET 5 Identity

    ASP.NET 5 Identity   “跌倒了”指的是这一篇博文:爱与恨的抉择:ASP.NET 5+EntityFramework 7 如果想了解 ASP.NET Identity 的“历史”及“ ...

  7. OpenSUSE 13.2安装Texlive2014+Texmaker+Lyx

    (1)首先下载安装Texlive2014 地址:http://mirrors.ustc.edu.cn/CTAN/systems/texlive/Images/ 或直接下载: wget http://m ...

  8. 【WebSocket初探 】

    众所周知,socket是编写网络通信应用的基本技术,网络数据交换大多直接或间接通过socket进行.对于直接使用socket的client与服务端,一旦连接被建立则均可主动向对方传送数据,而对于使用更 ...

  9. 谈谈Oracle dba_free_space

    谈谈Oracle dba_free_space 博客分类: ORACLE管理 OracleSQLC#C++C  顾名思义,dba_free_space指的是Oracle还有多少表空间剩余空间,其视图结 ...

  10. 反射导出excel案例

    1.代码案例: protected void btnExportExcel_Click(object sender, EventArgs e) { SetSearchValue(); Dictiona ...