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

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

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

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

Code
using 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 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();
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  测试实体,下面只是个简单的测试,大家可以发散一下,写出更加有复用性的方法。

Code
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;
}
}


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, nullnew 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, nullnew CacheItemDependency("s1"));
        }
        
this.Label1.Text = cacheManager.GetData("s"as string;
    }
}

目录
打赏
0
0
0
0
52
分享
相关文章
vsan数据恢复—vsan缓存盘故障导致虚拟机磁盘文件丢失的数据恢复案例
VMware vsan架构采用2+1模式。每台设备只有一个磁盘组(7+1),缓存盘的大小为240GB,容量盘的大小为1.2TB。 由于其中一台主机(0号组设备)的缓存盘出现故障,导致VMware虚拟化环境中搭建的2台虚拟机的磁盘文件(vmdk)丢失。
JVM知识体系学习三:class文件初始化过程、硬件层数据一致性(硬件层)、缓存行、指令乱序执行问题、如何保证不乱序(volatile等)
这篇文章详细介绍了JVM中类文件的初始化过程、硬件层面的数据一致性问题、缓存行和伪共享、指令乱序执行问题,以及如何通过`volatile`关键字和`synchronized`关键字来保证数据的有序性和可见性。
89 3
大数据-89 Spark 集群 RDD 编程-高阶 编写代码、RDD依赖关系、RDD持久化/缓存
大数据-89 Spark 集群 RDD 编程-高阶 编写代码、RDD依赖关系、RDD持久化/缓存
87 4
在清空NPM缓存后,我如何检查是否所有依赖都已正确安装?
【10月更文挑战第5天】在清空NPM缓存后,我如何检查是否所有依赖都已正确安装?
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
187 1
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
在清空NPM缓存后,如何检查是否所有依赖都已正确安装
在清空NPM缓存后,如何检查是否所有依赖都已正确安装
【Azure Redis 缓存 Azure Cache For Redis】如何设置让Azure Redis中的RDB文件暂留更久(如7天)
【Azure Redis 缓存 Azure Cache For Redis】如何设置让Azure Redis中的RDB文件暂留更久(如7天)
【Azure Redis 缓存】Azure Cache for Redis 服务的导出RDB文件无法在自建的Redis服务中导入
【Azure Redis 缓存】Azure Cache for Redis 服务的导出RDB文件无法在自建的Redis服务中导入
【Azure Redis 缓存】Redis导出数据文件变小 / 在新的Redis复原后数据大小压缩近一倍问题分析
【Azure Redis 缓存】Redis导出数据文件变小 / 在新的Redis复原后数据大小压缩近一倍问题分析