由于工作的需要,最近对.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. 【Stackoverflow好问题】java在,如何推断阵列Array是否包括指定的值

    问题 java中,怎样推断数组Array是否包括指定的值 精华回答 1. Arrays.asList(...).contains(...) 2. 使用 Apache Commons Lang包中的Ar ...

  2. Linux应用环境

    转载Linux应用环境 阅读目录 引言 使用 Linux 的一些困难和解决方法 我眼中的Linux哲学总纲 我这一系列随笔中展现出的Linux哲学 Linux之得和Linux之失 总结 回到顶部 引言 ...

  3. 【百度地图API】情人节求爱大作战——添加标注功能

    原文:[百度地图API]情人节求爱大作战--添加标注功能 任务描述: 2月2日是除夕,2月14立马来!即将到来的情人节,你想送TA一份什么礼物呢? 不如,在你们居住的地方,画个大大的桃心,表达你对TA ...

  4. AngularJS之使用控制器封装业务逻辑

    AngularJS之使用控制器封装业务逻辑 控制器的作用 我们知道,在AngularJS中,实现数据绑定的核心是scope对象.那么控制器又有什么用呢? 简单地说,没有控制器/controller,我 ...

  5. finally 对 return 值没有影响

    public int gettest(ref int i, ref int k) { int j = 0; try { return i / j; } catch (Exception Ex) { k ...

  6. Thrift实践

    Thrift实践:(一)安装 -- 未完待续   1. 新建一个目录,C:\test\thrift-test,里面建2个子文件夹,client-node和sever-csharp,然后把Thrift官 ...

  7. PHP单元测试利器:PHPUNIT初探

    开始动手安装phpunit 本文中将通过介绍php中的单元测试利器phpunit(http://phpunit.de/),并通过实际例子来讲解如何在实际工作中运用phpunit.首先安装phpunit ...

  8. 原生JS的DOM节点操作

    DOM(Document Object Model/文档对象模型)是针对HTML和XML文档的一个API.DOM节点树:在文档中出现的空格.回车.标签.注释.文本.doctype.标签等都属于DOM节 ...

  9. windows 开机自动登录,或者说是开机后自动进入桌面

    这篇文章,对于XP以及XP以上版本有效,包括Windows Server服务器操作系统. 1.原理 --Windows自动登录的原理是,开始后,自动输入登录所使用的账号的用户名和密码,并且自动进入桌面 ...

  10. PHP 调用asp.net Web Services服务问题总结

    原文:PHP 调用asp.net Web Services服务问题总结 PHP是弱类型语言,转换非常不方便. < ?php //soap 客户端 $client=new SoapClient(' ...