深入System.Web.Caching命名空间 教你Hold住缓存管理(二)

本文分三篇,从缓存所在命名空间System.Web.Caching开始,详细的介绍.NET框架提供的缓存类和操作方法。看完之后你将学会:

在学习了第一篇Cache类的用法后,下面我们来继续看看如果缓存从文件中读取的的数据,并通过缓存依赖类CacheDependency实现缓存数据的及时更新。

一,缓存依赖类CacheDependency

  CacheDependency类是架设在Cache类和实际数据之前的桥梁,其具体的意义是当缓存对象的实际数据发生改变的时候,它能及时的通知缓存对象。

  假如缓存对象”Player“保存的是一个XML文件的数据,如果XML文件发生了变化,那么系统通过CacheDependency类就会及时的更新缓存对象的内容,保证用户读取的永远是最新的数据。

  1.语法定义

  CacheDependency类的语法定义如下:

public class CacheDependency : IDisposable

  继承了接口”IDisposable“,此接口主要用来定义释放分配的非托管资源的方法。继承此接口的类,必须实现方法Dispone ,实现资源的释放。

  继承这个接口有什么好处呢,看下面一段代码:

    using (CacheDependency mydep = new CacheDependency("player.xml"))
    {
        //dosomething
    }

  这样使用using来创建一个新对象,在出了这个作用域之后,即”{}“内的代码执行完毕,系统就会自动调用Dispone来释放该对象占用的资源。

  经常打开数据库链接又懒得去显式关闭的同学,对此应该比较熟悉。

  CacheDependency类构造函数实现了8个对外公开的重载,虽然全部列出麻烦了点,但为了知道CacheDependency究竟能为缓存带来什么优势,我们来细说一下每个重载。

1 public CacheDependency(string filename);
2 public CacheDependency(string[] filenames);3 public CacheDependency(string[] filenames, string[] cachekeys); 4 public CacheDependency(string filename, DateTime start);5 public CacheDependency(string[] filenames, DateTime start);6 public CacheDependency(string[] filenames, string[] cachekeys, CacheDependency dependency);//dependency参数声明此依赖项依赖另外一个CacheDependency的实例7 public CacheDependency(string[] filenames, string[] cachekeys, DateTime start); 8 public CacheDependency(string[] filenames, string[] cachekeys, CacheDependency dependency, DateTime start);

  (1)监视文件或目录<参数filename>更改情况,当该资源发生变化时,与此依赖项对象关联的缓存对象将过期,并从缓存中移除。

  (2)监视一组文件或目录<参数filenames>更改情况,当这些资源中任何一个变化时,处理同上。

  (3)监视一组文件或目录<参数filenames>的同时,也监视一组缓存键<参数cachekeys>的更改情况,当这些资源中任何一个变化时,处理同上。

  这三个是最基本的构造函数,其他的重载只是声明了此依赖项所依赖另外一个CacheDependency的实例<参数dependency>,

  或是监视对象上次修改日期所依据的日期和时间<参数start>。

  2.方法和属性

  CacheDependency的组成结构与它重要的功能比起来,较为简单。主要有两个属性和一个方法:

  • 属性”HasChanged“:判断CacheDependency对象是否已更改。
  • 属性”UtcLastModified“:返回上次依赖项的修改日期。
  • 方法”Dispose“:释放CacheDependency对象占用的资源。

  我们在最后的应用的例子中来了解这些属性和方法的使用。

二,典型应用:用CacheDependency获取最新的数据

  我们这里需要使用CacheDependency类来实现数据的及时更新。演示中使用GridView来显示一个XML文件的数据,当XML文件数据发生改变时,客户端可以及时更新。

  先来看下实现的过程图解:

  

  下面我们来实现这个过程。

  1,首先我们使用VisualStudio创建一个ASP.NET网站,命名为”JohnConnor.CacheDependencySample“,并在根目录下添加一个文件名为players的XML文件:

<?xml version="1.0" encoding="utf-8" ?>
<playerslist>
    <player>
        <name>KobeByrant</name>
        <height>1.98m</height>
    </player>
    <player>
        <name>AllenIverson</name>
        <height>1.83m</height>
    </player>
</playerslist>

  2,我们打开默认生成的Default .aspx页,在设计视图中添加一个GridView和按钮和一个Label控件。然后在代码视图的Page_Load事件中添加生成缓存的代码:

 private static CacheDependency mydepen;
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                DataSet myds = new DataSet();//创建XML数据源
                myds.ReadXml(this.MapPath(Request.ApplicationPath + @"/players.xml"));//数据源来自文件players.xml
                if (Cache["Players"] == null)//判断缓存是否存在
                {
                    mydepen = new CacheDependency(this.MapPath(Request.ApplicationPath + @"/players.xml"));//创建缓存依赖
                    //添加缓存项
                    Cache.Add("Players", myds, mydepen, Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(10), CacheItemPriority.Normal, null);
                }
            }
        }

  3,最后我们在按钮的Click事件里判断实际数据是否被修改,如果修改则重新生成缓存和依赖,并绑定数据:

 protected void Button1_Click(object sender, EventArgs e)
        {
            if (mydepen.HasChanged)//判断实际数据是否发生了变化
            {
                Label1.Text="球员列表已经改变,上一次修改时间:" + mydepen.UtcLastModified;
                DataSet myds = new DataSet();//创建XML数据源
                myds.ReadXml(this.MapPath(Request.ApplicationPath + @"/players.xml"));//数据源来自文件players.xml
                mydepen = new CacheDependency(this.MapPath(Request.ApplicationPath + @"/players.xml"));//重新创建缓存依赖
                //重新添加缓存项
                Cache.Add("Players", myds, mydepen, Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(10), CacheItemPriority.Normal, null);
            }
            GridView1.DataSource = Cache["Players"];
            GridView1.DataBind();
        }

  现在F5运行,点击按钮就会得到XML文件中的数据:

  

  然后我们对XML文件进行修改,添加一个球员,点击按钮,就会刷新缓存,显示最新的数据:

  

  虽然我的名字出现在这里有点突兀哈哈,请大家不要喷我。

  这一篇我们解决了使用文件依赖来进行缓存及时更新的问题。

  下一篇我们要解决的问题是当数据库内容发生改变时,如何及时通知缓存,并更新缓存中的数据,请大家多多支持。

原文地址:https://www.cnblogs.com/liaods/p/9940409.html

时间: 2024-08-04 19:50:01

深入System.Web.Caching命名空间 教你Hold住缓存管理(二)的相关文章

深入System.Web.Caching命名空间 教你Hold住缓存管理(一)

本文分三篇,从缓存所在命名空间System.Web.Caching开始,详细的介绍.NET框架提供的缓存类和操作方法.看完之后你将学会: 第一篇-如何实现简单的数据缓存 第二篇-缓存从文件中读取的数据,并通过文件依赖实现缓存数据的及时更新 第三篇-缓存数据库中的整张表,并通过数据库依赖实现缓存数据的及时更新 一,System .Web.Caching与缓存工作机制简介 System.Web.Caching是用来管理缓存的命名空间,其父级空间是System.Web,由此可见,缓存通常用于Web网站

System.Web.Caching

System.Web.Caching 本文转载自 宋辉 缓存主要是为了提高数据的读取速度.因为服务器和应用客户端之间存在着流量的瓶颈,所以读取大容量数据时,使用缓存来直接为客户端服务,可以减少客户端与服务器端的数据交互,从而大大提高程序的性能. 本章从缓存所在的命名空间“System.Web.Caching”开始,详细介绍框架提供的缓存类和操作方法,主要涉及简单数据的缓存.数据缓存依赖和数据库缓存依赖三个技术要点,最后演示一个完全使用缓存实现数据读取的实例. 16.1  System.Web.C

System.Web.Caching.Cache类 缓存 各种缓存依赖

System.Web.Caching.Cache类 缓存 各种缓存依赖 Cache类,是一个用于缓存常用信息的类.HttpRuntime.Cache以及HttpContext.Current.Cache都是该类的实例. 一.属性 属性 说明 Count 获取存储在缓存中的项数. EffectivePercentagePhysicalMemoryLimit 获取在 ASP.NET 开始从缓存中移除项之前应用程序可使用的物理内存百分比. EffectivePrivateBytesLimit 获取可用

System.Web.Caching.Cache类 Asp.Net缓存 各种缓存依赖

Cache类,是一个用于缓存常用信息的类.HttpRuntime.Cache以及HttpContext.Current.Cache都是该类的实例. 一.属性 属性 说明 Count 获取存储在缓存中的项数. EffectivePercentagePhysicalMemoryLimit 获取在 ASP.NET 开始从缓存中移除项之前应用程序可使用的物理内存百分比. EffectivePrivateBytesLimit 获取可用于缓存的字节数. Item 获取或设置指定键处的缓存项. 二.方法 方法

System.Web.Caching.Cache类 缓存 各种缓存依赖(转)

转自:http://www.cnblogs.com/kissdodog/archive/2013/05/07/3064895.html Cache类,是一个用于缓存常用信息的类.HttpRuntime.Cache以及HttpContext.Current.Cache都是该类的实例.尽量使用前者. 一.属性 属性 说明 Count 获取存储在缓存中的项数. EffectivePercentagePhysicalMemoryLimit 获取在 ASP.NET 开始从缓存中移除项之前应用程序可使用的物

vs2012找不到system web optimization命名空间

今天新装了vs2012,安装完成后,创建了一个mvc4应用程序,创建生成出现了几个错误.通过错误我们的解决方案就是去找引用不到的路径,如何在vs2012中实现呢? 在工具栏中找工具--库程序包管理器---程序包管理器控制台 完成后下方会出现一个控制台框.在控制台中输入 Install-Package Microsoft.AspNet.Web.Optimization 回车,即可将未引用的程序集下载下来.目前我只完成到这一部,可是通过项目 添加引用总是不成功,不知道为啥.求指教. vs2012找不

关于System.Web.Caching的“未将对象引用设置到对象的实例”错误

初接触Asp.Net不久,想在后端做个缓存机制,于是使用了System.Web.Caching的Cache类. 使用部分的逻辑很简单,但是取值时总报错 private static Cache cache = new Cache(); public static string LoadCache(string Key)        {            if (cache[Key] == null)//这一步报错            {                return nul

Excel数据导入___你hold住么(二)

小编在上一篇博文中描述了Excel数据导入的大致流程和一个Demo实例 Excel数据导入___你hold住么(一)          在本篇将带领大家一同了解 导入Excel流程和问题解决方案: 导入Excel流程和步骤 需要注意的是在Server端的Web Config 中添加这几行代码 <!-- 导入Excel 徐露 -2015-7-8 --> <appSettings> <addkey="DbContextFactoryclassFulleName"

System.Web.Caching.Cache

此类是利用缓存来保存信息的.可以把一些稳定的数据,不会随用户而改变的信息利用Cache保存起来,可以优化网站的速度. Cache和Session,cookie的区别 Session保存在服务器上,每个用户都有自己的Session,不会冲突,关闭网站后该Session丢失. Cookie是保存在客户端的,如果不清除流浪器的cookie或者不设置过期时间,cookie都不会丢失. Cache是分配在服务器上的一个公共的内存片.从Cache中读取数据比较快,有些网站就把一些经常被使用的数据放到Cach