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

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

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

Code

using System;

using System.Web;

using Microsoft.Practices.Enterprise
Library.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 = Cache
Factory.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

}

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  定义修改依赖项缓存的方法

Code

using 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();

for
each (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;
                }

时间: 2024-10-25 05:19:49

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

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

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

微软企业库 缓存

            //创建CacheManager            CacheManager cacheManager = (CacheManager)CacheFactory.GetCacheManager();             if (string.IsNullOrEmpty((String)cacheManager.GetData("MyDataReader")))            {                //添加缓存项            

基于微软企业库的AOP组件(含源码)

软件开发,离不开对日志的操作.日志可以帮助我们查找和检测问题,比较传统的日志是在方法执行前或后,手动调用日志代码保存.但自从AOP出现后,我们就可以避免这种繁琐但又必须要实现的方式.本文是在微软企业库的AOP基础上封装出的组件.注意:是使用2.0版本,因为2.0以上版本是基于Net4.5类库的.好了,废话不多说.如图-1所示 图-1 说明     logmethodBillModel文件,是记录AOP详细信息     IBasicCodeService和BasicCodeService是用于测试

asp.net开发中怎样去突破文件依赖缓存_实用技巧

在Web项目中可以使用Session,Application等来缓存数据,也可以使用Cache来缓存. 今天我们特别关注的是Cache缓存.Cache位于命名空间System.Web.Caching命名空间下,看到这里我们想到的是它在Web项目中使用. 说明:Cache 类不能在 ASP.NET 应用程序外使用.它是为在 ASP.NET 中用于为 Web 应用程序提供缓存而设计和测试的.在其他类型的应用程序(如控制台应用程序或 Windows 窗体应用程序)中,ASP.NET 缓存可能无法正常工

企业库 如何配置按日期来记录日志文件

问题描述 企业库如何配置按日期来记录日志文件 解决方案 解决方案二:沉了顶上去解决方案三:这个问题是否可以解决?解决方案四:帮你顶解决方案五:自己再琢磨吧

PHP基于文件存储实现缓存的方法_php技巧

本文实例讲述了PHP基于文件存储实现缓存的方法.分享给大家供大家参考.具体如下: 在一些数据库数据记录较大,但是服务器有限的时候,可能一条MySQL查询就会好几百毫秒,一个简单的页面一般也有十几条查询,这个时候也个页面加载下来基本要好几秒了,如果并发量高的话服务器基本就瘫痪了,造成一个页面很久也加载不下来,这个时候我们可以使用文件缓存来缓解下MySQL的压力,下面给个使用例子. <?php //页面业务逻辑处理,获得结果 $objPage = new Page_IndexModel($arrPa

.NET 2.0中的企业库异常处理块简述

异常处理 企业库异常处理块(Enterprise Library Exception Handling Block)提供了处理异常所需的所有基本代码,现在,你可以不用再编写这些重复性的异常处理代码,只需简单地在程序中使用它们,就可保证一致且高效地异常处理. 在一个理想的程序世界中,编写的所有代码都是运行无误的,但现实是,无论你在编写代码时多么地小心,错误总会发生,所以,必须要有一个高效.可配置的框架(framework),以一种"优雅"方式来处理错误:另外,也必须要懂得,人们通常以对程

【springmvc+mybatis项目实战】杰信商贸-4.maven依赖+PO对+映射文件

我们来为刚刚创建的数据库表来在工程中创建PO对象 首先我们要创建工程 项目的开发环境 序号 工  具                用  途 1 MyEclipse 2014   IDE 2 JDK 1.7.9        Java虚拟机 3 TOMCAT 7.0.26       中间件 4 Oracle11g/10g.MySQL 5.0.87数据库 5 PL/SQL .SQLyog 8.2SQL控制台 6 apache-maven-3.0.5MAVEN 7 PowerDesigner 15

库缓存(Library Cache)内存结构

库缓存(Library Cache)内存结构 Library cache是Shared pool的一部分,它几乎是Oracle内存结构中最复杂的一部分. 一 , Library cache存放什么(存放的信息单元都叫做对象) ?   Library存放的信息单元都叫做对象,这些对象可以分为两类:  1. 存储对象  2. 过渡对象(游标Cursor,这里的游标指生成的可执行的对象, 运行相同SQL的多个进程可以共享该SQL产生的游标,节省内存.) A. 用户提交的SQL  B. SQL语句相关的