zoukankan      html  css  js  c++  java
  • 深入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文件进行修改,添加一个球员,点击按钮,就会刷新缓存,显示最新的数据:

      

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

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

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

  • 相关阅读:
    JAVA Web.xml 加载顺序
    eclipse修改SVN下载的项目“>”变成“*”
    MyBatis学习总结(一)——MyBatis快速入门
    Java集合和PHP的对比
    Java对数组对象进行排序
    php 的一个pg_fetch_assoc的怪问题
    Android 更好的Activity生命周期回调
    安卓通知栏的用法
    用广播监听安卓设备电量状态
    attempting to bokeyaunrun eclipse useing the jre instead of jdk,to run eclipse using
  • 原文地址:https://www.cnblogs.com/liaods/p/9940409.html
Copyright © 2011-2022 走看看