艾伟_转载:企业库缓存依赖的实现-基于文件依赖

最近在做项目的时候,采用用Codesmith和Nettiers生成的框架来实现,生成的代码核心是基于企业库的。所以最近在恶补企业库,对于缓存的学习当然是必不可少的,尤其是经常要用到得缓存依赖,这里我用到的是文件依赖来举例子,其他的都大同小异,主要就是要实现ICacheItemExpiration中的返回值类型为bool类型的HasExpired方法,来控制到期与否,实现此方法是关键所在。下面是程序清单,欢迎大家指正:

step1 实现缓存到期接口,此类就为缓存项依赖的类,为缓存依赖的核心,尤其是其中HasExpired方法的定义,此类的核心就是使用lastCount是否变化来判断缓存是否到期;如果有变化则HasExpired方法返回true,否则返回false。

Codeusing System;using System.Web;using Microsoft.Practices.EnterpriseLibrary.Caching;

/// <summary>///CacheItemDependency 的摘要说明/// </summary>public class CacheItemDependency : ICacheItemExpiration{//依赖缓存项键    private readonly string dependencyCacheKey;

//依赖缓存项值    private System.Int32 lastCount;

#region Constructor/// <summary>/// 初始化依赖缓存项,如果此缓存管理对象存在,则取出缓存的数据;若不存在,就要对此缓存管理赋值/// </summary>/// <param name="cacheKey">依赖缓存项的键</param>    public CacheItemDependency(string cacheKey)    {        dependencyCacheKey = cacheKey;        ICacheManager cacheManager = CacheFactory.GetCacheManager();        lastCount = Int32.MinValue;if (cacheManager != null)        {if (cacheManager.Contains(cacheKey))            {object o = cacheManager.GetData(cacheKey);if (o != null)                {this.lastCount = (int)o;                }

lastCount = (int)cacheManager.GetData(cacheKey);            }else            {                cacheManager.Add(cacheKey, lastCount);            }        }

}#endregion

#region Propertiespublic string DependencyCacheKey    {get { return dependencyCacheKey; }    }

public System.Int32 LastCount    {get { return lastCount; }    }#endregion

#region ICacheItemExpiration Memberspublic bool HasExpired()    {        ICacheManager cacheManager = CacheFactory.GetCacheManager();if (cacheManager == null)        {return true;        }

System.Int32 currentCount = (int)cacheManager.GetData(dependencyCacheKey);if (currentCount != lastCount)        {return true;        }else        {return false;        }    }public void Notify()    {    }public void Initialize(CacheItem owningCacheItem)    {    }#endregion

}

using System;
using System.Web;
using Microsoft.Practices.EnterpriseLibrary.Caching;

/// 
///CacheItemDependency 的摘要说明
/// 
public class CacheItemDependency : ICacheItemExpiration
{
    //依赖缓存项键
    private readonly string dependencyCacheKey;

    //依赖缓存项值
    private System.Int32 lastCount;

    #region Constructor
    /// 
    /// 初始化依赖缓存项,如果此缓存管理对象存在,则取出缓存的数据;若不存在,就要对此缓存管理赋值
    /// 
    /// 依赖缓存项的键
    public CacheItemDependency(string cacheKey)
    {
        dependencyCacheKey = cacheKey;
        ICacheManager cacheManager = CacheFactory.GetCacheManager();
        lastCount = Int32.MinValue;
        if (cacheManager != null)
        {
            if (cacheManager.Contains(cacheKey))
            {
                object o = cacheManager.GetData(cacheKey);
                if (o != null)
                {
                    this.lastCount = (int)o;
                }

                lastCount = (int)cacheManager.GetData(cacheKey);
            }
            else
            {
                cacheManager.Add(cacheKey, lastCount);
            }
        }

    }
    #endregion

    #region Properties
    public string DependencyCacheKey
    {
        get { return dependencyCacheKey; }
    }

    public System.Int32 LastCount
    {
        get { return lastCount; }
    }
    #endregion

    #region ICacheItemExpiration Members
    public bool HasExpired()
    {
        ICacheManager cacheManager = CacheFactory.GetCacheManager();
        if (cacheManager == null)
        {
            return true;
        }

        System.Int32 currentCount = (int)cacheManager.GetData(dependencyCacheKey);
        if (currentCount != lastCount)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    public void Notify()
    {
    }
    public void Initialize(CacheItem owningCacheItem)
    {
    }
    #endregion

}

step2  定义修改依赖项缓存的方法

Codeusing System;using System.Web;using Microsoft.Practices.EnterpriseLibrary.Caching;

/// <summary>///DataAccessUtil 的摘要说明/// </summary>public class DataAccessUtil{public DataAccessUtil()    {////TODO: 在此处添加构造函数逻辑//    }

/// <summary>/// 更新所有以cacheKeys中元素为key的缓存项/// </summary>/// <param name="cacheKeys">缓存项的key的数组</param>    public static void UpdateCacheDependency(string[] cacheKeys)    {        ICacheManager cacheManager = CacheFactory.GetCacheManager();foreach (string cacheKey in cacheKeys)        {if (cacheManager != null && cacheManager.Contains(cacheKey))            {int lastCount = (int)cacheManager.GetData(cacheKey);if (lastCount < Int32.MaxValue)                {                    lastCount++;                }else                {                    lastCount = Int32.MinValue;                }// 这一句的作用在于更新以cacheKey为key的缓存项,从而使依赖于此缓存项的缓存项失效.                cacheManager.Add(cacheKey, lastCount);            }        }    }}

using System;
using System.Web;
using Microsoft.Practices.EnterpriseLibrary.Caching;

/// 
///DataAccessUtil 的摘要说明
/// 
public class DataAccessUtil
{
    public DataAccessUtil()
    {
        //
        //TODO: 在此处添加构造函数逻辑
        //
    }

    /// 
    /// 更新所有以cacheKeys中元素为key的缓存项
    /// 
    /// 缓存项的key的数组
    public static void UpdateCacheDependency(string[] cacheKeys)
    {
        ICacheManager cacheManager = CacheFactory.GetCacheManager();
        foreach (string cacheKey in cacheKeys)
        {
            if (cacheManager != null && cacheManager.Contains(cacheKey))
            {
                int lastCount = (int)cacheManager.GetData(cacheKey);
                if (lastCount < Int32.MaxValue)
                {
                    lastCount++;
                }
                else
                {
                    lastCount = Int32.MinValue;
                }
                // 这一句的作用在于更新以cacheKey为key的缓存项,从而使依赖于此缓存项的缓存项失效.
                cacheManager.Add(cacheKey, lastCount);
            }
        }
    }
}

step3  测试实体,下面只是个简单的测试,大家可以发散一下,写出更加有复用性的方法。

Codeusing System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;using Microsoft.Practices.EnterpriseLibrary.Caching;

public partial class Test : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e)    {if (!IsPostBack)        {            ICacheManager cacheManager = CacheFactory.GetCacheManager();            cacheManager.Add("s", TextBox1.Text, CacheItemPriority.Normal, null, new CacheItemDependency("s1"));this.Label1.Text = cacheManager.GetData("s") as string;        }    }protected void Button1_Click(object sender, EventArgs e)    {        ICacheManager cacheManager = CacheFactory.GetCacheManager();        DataAccessUtil.UpdateCacheDependency(new string[] { "s1" });if (cacheManager.GetData("s") == null)        {            cacheManager.Add("s", TextBox1.Text, CacheItemPriority.Normal, null, new CacheItemDependency("s1"));        }this.Label1.Text = cacheManager.GetData("s") as string;    }}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Microsoft.Practices.EnterpriseLibrary.Caching;

public partial class Test : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            ICacheManager cacheManager = CacheFactory.GetCacheManager();
            cacheManager.Add("s", TextBox1.Text, CacheItemPriority.Normal, null, new CacheItemDependency("s1"));
            this.Label1.Text = cacheManager.GetData("s") as string;
        }
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        ICacheManager cacheManager = CacheFactory.GetCacheManager();
        DataAccessUtil.UpdateCacheDependency(new string[] { "s1" });
        if (cacheManager.GetData("s") == null)
        {
            cacheManager.Add("s", TextBox1.Text, CacheItemPriority.Normal, null, new CacheItemDependency("s1"));
        }
        this.Label1.Text = cacheManager.GetData("s") as string;
    }
}

时间: 2024-11-04 00:34:13

艾伟_转载:企业库缓存依赖的实现-基于文件依赖的相关文章

企业库缓存依赖的实现-基于文件依赖

最近在做项目的时候,采用用Codesmith和Nettiers生成的框架来实现,生成的代码核心是基于企业库的.所以最近在恶补企业库,对于缓存的学习当然是必不可少的,尤其是经常要用到得缓存依赖,这里我用到的是文件依赖来举例子,其他的都大同小异,主要就是要实现ICacheItemExpiration中的返回值类型为bool类型的HasExpired方法,来控制到期与否,实现此方法是关键所在.下面是程序清单,欢迎大家指正: step1 实现缓存到期接口,此类就为缓存项依赖的类,为缓存依赖的核心,尤其是

艾伟_转载:ASP.NET缓存

介绍 缓存是在内存存储数据的一项技术,也是ASP.NET中提供的重要特性之一.例如你可以在复杂查询的时候缓存数据,这样后来的请求就不需要从数据库中取数据,而是直接从缓存中获取.通过使用缓存可以提高应用程序的性能. 主要有两种类型的缓存: 1.输出缓存Output caching2.数据缓存Data caching 1. 输出缓存(Output Caching) 使用输出缓存,你可以缓存最后输出的HTML页面,当相同的页面再次请求的时候,ASP.NET不会再执行页面的生命周期和相关代码而是直接使用

艾伟_转载:WCF版的PetShop之一:PetShop简介

本系列文章导航 WCF版的PetShop之一:PetShop简介 WCF版的PetShop之二:模块中的层次划分 WCF版的PetShop之三:实现分布式的Membership和上下文传递 在<WCF技术剖析(卷1)>的最后一章,我写了一个简单基于WCF的Web应用程序,该程序模拟一个最简单的网上订购的场景,所以我将其命名为PetShop.PetShop的目在于让读者体会到在真正的项目开发中,如何正确地.有效地使用WCF.在这个应用中,还会将个人对设计的一些总结融入其中,希望能够对读者有所启发

艾伟_转载:ASP.NET数据缓存之数据缓存浅谈

ASP.NET数据缓存的学习是如何呢?如何使用ASP.NET数据缓存呢?在讲ASP.NET数据缓存之前还要先说一下如果在页面中使用参数缓存.前面讲过一个缓存设置VaryByParam="none"为无参数,我们也可以对VaryByParam进行设置,设置的参数与随 GET 方法属性发送的查询字符串值对应,或与使用 POST 方法发送的参数对应.将该属性设置为多个参数时,对于每个指定参数组合,输出缓存都包含一个不同版本的请求文档.可能的值包括 none.星号 (*) 以及任何有效的查询字

艾伟_转载:Lucene.net操作索引库

  删除 (软删除,仅添加了删除标记.调用IndexWriter.Optimize() 后真正删除)IndexReader reader = IndexReader.Open(directory); // 删除指定序号(DocId)的 Document.reader.Delete(123); // 删除包含指定 Term 的 Document.reader.Delete(new Term(FieldValue, "Hello")); // 恢复软删除.reader.UndeleteAl

艾伟_转载:浅析ASP.NET页面缓存的几点体会

前几天遇到个问题,百思不得其解.后来查阅了一些资料心里才有了点思路.把自己遇到的问题记录下来希望能给其他的园友一些帮助吧. 事情是这样的.我的一个ASP.NET页面用window.open导航后再次访问时没有得到更新,确切的说是再次访问时根本就没有访问服务器.可是这个现象在我的机器上并没有出现,而项目组中其他的机器都有此问题.当时我这个郁闷呐,因为不方便调试,最后就在页面上输出好多alert.终于在几次试验之后发现了问题的所在. 其主要问题就是IE缓存了页面,当服务器端出现更新时IE并没有检查到

艾伟_转载:从MySpace基于.NET平台的六次重构经历,来感受分布式

Myspace和Facebook都是很优秀的社交类网站,它们拥有的用户和fans之多,大家都很清楚. Myspace是一个基于.NET平台的,而Facebook更多是基于LAMP的. 我们来看看MySpace配合.NET+Windows Server 2003+Sql Server 2000/2005+IIS怎么创造传奇的 文章正文如下: 在每个里程碑,站点负担都会超过底层系统部分组件的最大载荷,特别是数据库和存储系统.接着,功能出现问题,用户失声尖叫.最后,技术团队必须为此修订系统策略.虽然自

艾伟_转载:.NET设计模式:抽象工厂模式(Abstract Factory)

概述 在软件系统中,经常面临着"一系列相互依赖的对象"的创建工作:同时由于需求的变化,往往存在着更多系列对象的创建工作.如何应对这种变化?如何绕过常规的对象的创建方法(new),提供一种"封装机制"来避免客户程序和这种"多系列具体对象创建工作"的紧耦合?这就是我们要说的抽象工厂模式. 意图 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 模型图 逻辑模型: 物理模型: 生活中的例子 抽象工厂的目的是要提供一个创建一系列相关或

艾伟_转载:从ASP.NET的PHP执行速度比较谈起

上星期我在InfoQ发表了一篇新闻,对Joe Stagner在博客上发表的三篇关于ASP.NET与PHP性能对比的文章进行了总结.写新闻其实挺不爽的,因为不能夹杂个人的看法,只能平铺直叙陈述事实.当然,如果像某些新闻那样"换一种说法"是可以骗过一些"不明真相的群众",但是这就有违道德了.因此,在客观陈述完新闻内容之后,我只能选择把自己的感想.评论等内容放在自己的博客上. Joe Stagner的背景挺特殊,它是PHP的老用户,在ASP.NET出现之前就是PHP的重量