zoukankan      html  css  js  c++  java
  • 艾伟_转载:企业库缓存依赖的实现基于文件依赖 狼人:

    最近在做项目的时候,采用用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

    }

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

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

  • 相关阅读:
    20161101学习笔记
    20161031学习笔记
    20161028学习笔记
    20161027学习笔记
    ReentrantLock Condition
    ReentrantLock 重入锁
    CountDownLatch用法与原理
    场景化解释 AQS原理
    Atomic
    多线程工具类
  • 原文地址:https://www.cnblogs.com/waw/p/2157169.html
Copyright © 2011-2022 走看看