System.Web.Caching.Cache删除某键后,希望同时触发其它动作(关键时刻,还是事件靠的住)

System.Web.Caching.Cache是.net为我们提供的一个轻量级的缓存组件,它提供了最基础的增,增过期,删除,获取等操作,下面是对Cache进行的一个封装,方便以后统一调用和扩展。

/// <summary>
    /// 缓o存?相à关?的?操ù作÷类à
    /// 占?占?
    /// </summary>
    public class DataCache
    {
        /// <summary>
        /// 获?取?当±前°应|用?程ì序ò指?定¨CacheKey的?Cache值μ
        /// </summary>
        /// <param name="CacheKey"></param>
        /// <returns></returns>
        public static object GetCache(string CacheKey)
        {
            System.Web.Caching.Cache objCache = HttpRuntime.Cache;
            return objCache[CacheKey];

        }
        /// <summary>
        /// 设è置?当±前°应|用?程ì序ò指?定¨CacheKey的?Cache值μ
        /// 调÷用?:oDataCache.SetCache("name", "zzl");
        /// </summary>
        /// <param name="CacheKey"></param>
        /// <param name="objObject"></param>
        public static void SetCache(string CacheKey, object objObject)
        {
            System.Web.Caching.Cache objCache = HttpRuntime.Cache;
            objCache.Insert(CacheKey, objObject);
        }

        /// <summary>
        /// 设è置?当±前°应|用?程ì序ò指?定¨CacheKey的?Cache值μ
        /// 调÷用?:oDataCache.SetCache("name", "zzl", DateTime.Now.AddMinutes(1), TimeSpan.Zero);
        /// </summary>
        /// <param name="CacheKey"></param>
        /// <param name="objObject"></param>
        public static void SetCache(string CacheKey, object objObject, DateTime absoluteExpiration, TimeSpan slidingExpiration)
        {
            System.Web.Caching.Cache objCache = HttpRuntime.Cache;
            objCache.Insert(CacheKey, objObject, null, absoluteExpiration, slidingExpiration);
        }

        /// <summary>
        /// 移?除y指?定¨Cache
        /// </summary>
        /// <param name="CacheKey"></param>
        public static void RemoveCache(string CacheKey)
        {
            System.Web.Caching.Cache objCache = HttpRuntime.Cache;
            objCache.Remove(CacheKey);

        }

        #region Events
        /// <summary>
        /// 缓o存?删?除y事?件t
        /// </summary>
        public static event CacheEventHandler CacheDeleted;
        #endregion

        #region Methods
        /// <summary>
        /// 触¥发¢缓o存?删?除y事?件t
        /// </summary>
        public static void OnCacheDeleted(string key)
        {
            if ((CacheDeleted != null))
            {
                CacheDeleted(null, new CacheEventArgs(key));
            }

           Remove(key);

        }
        #endregion
    }

    #region Delegates
    /// <summary>
    /// 缓o存?委ˉ托D
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    public delegate void CacheEventHandler(object sender, CacheEventArgs e);
    #endregion

    /// <summary>
    /// 缓o存?事?件t源′
    /// </summary>
    public class CacheEventArgs
    {
        public CacheEventArgs()
        {

        }
        public CacheEventArgs(string cacheKey)
        {
            this.CacheKey = cacheKey;
        }
        public string CacheKey { get; set; }
    }

在这个类中,有一个关于删除键时的事件,它的作用是在删除某个键时,进行与它关联的其它操作,例如:在用户登出时,希望将它的cache记录清除,并删除一些记录性的操作,但记录性的操作是不固定的,为了为破坏程序的完整性,我们可以在登出时,先去将其需要的操作进行有订阅,如果以后有其它删除cache键需要的关联操作,只要订阅就可以了

代码如下:

static CommonMethod()
       {
           iUserRepository = new UserRepository();
           //订?阅?了?CacheDeleted这a个?事?件t,?当±它ü被?触¥发¢时±,?将?自?动ˉ执′行D被?绑ó定¨的?方?法¨
           DataCache.CacheDeleted += new CacheEventHandler(ClearUserRecord);
           DataCache.CacheDeleted += new CacheEventHandler(ClearProductRecord);
       }
    #region 删?除yCache后ó,?需è要a做?的?其?它ü事?情é
        static void ClearUserRecord(object sender, CacheEventArgs e)
        {
            DataCache.SetCache("msg1", e.CacheKey + "被?删?除y了?");
        }

        static void ClearProductRecord(object sender, CacheEventArgs e)
        {
            DataCache.SetCache("msg2", e.CacheKey + "真?的?被?删?除y了?");
        }
        #endregion

在登出操作后,可以去触发删除cache键的操作:

 

public static ActionResult UserLogOutModule(Controller controller)
       {
           string returnUrl = controller.Request.QueryString["returnUrl"];
           Standard.ClientHelper.UserLogout();

  DataCache.OnCacheDeleted("name");

本文转自博客园张占岭(仓储大叔)的博客,原文链接:System.Web.Caching.Cache删除某键后,希望同时触发其它动作(关键时刻,还是事件靠的住),如需转载请自行联系原博主。

时间: 2024-12-30 21:56:32

System.Web.Caching.Cache删除某键后,希望同时触发其它动作(关键时刻,还是事件靠的住)的相关文章

System.Web.Caching.Cache类 缓存 各种缓存依赖

原文:System.Web.Caching.Cache类 缓存 各种缓存依赖 Cache类,是一个用于缓存常用信息的类.HttpRuntime.Cache以及HttpContext.Current.Cache都是该类的实例. 一.属性 属性 说明 Count 获取存储在缓存中的项数. EffectivePercentagePhysicalMemoryLimit 获取在 ASP.NET 开始从缓存中移除项之前应用程序可使用的物理内存百分比. EffectivePrivateBytesLimit 获

System.Web.Caching.Cache设置绝对时间过期,但是如果我更新了值就貌似失效了

问题描述 _cache.Insert(key,1,Nothing,DateTime.Now.AddSeconds(10),TimeSpan.Zero)实现了10秒之后就过期.可是如果我修改_cache.Item(key)=intCount之后,到10秒后就不过期了.我想要的结果是一旦插入了第一条,无论以后是查询还是修改键中的值,我都保持最初add时候的绝对过期时间.这个如何实现? 解决方案 解决方案二:对于Cache来说,使用_cache.Item可以读取它的值,但是对Item的项进行赋值,其实

System.Web.Caching.Cache绝对时间过期如果我更新了值就貌似失效了

问题描述 _cache.Insert(key,1,Nothing,DateTime.Now.AddSeconds(10),TimeSpan.Zero)实现了10秒之后就过期.可是如果我修改_cache.Item(key)=intCount之后,到10秒后就不过期了.我想要的结果是一旦插入了第一条,无论以后是查询还是insert修改,我都保持最初add时候的绝对过期时间.这个如何实现? 解决方案 解决方案二:在修改的时候不修改add时间

System.Web.Caching.Cache绝对时间过期如何实现

问题描述 _cache.Insert(key,1,Nothing,DateTime.Now.AddSeconds(10),TimeSpan.Zero)实现了10秒之后就过期.可是如果我修改_cache.Item(key)=intCount结果就不过期了.我想要的结果是一旦插入了第一条,无论以后是查询还是insert修改,我都保持最初add时候的绝对过期时间.这个如何实现? 解决方案 本帖最后由 MyLucifer1 于 2011-12-26 17:57:15 编辑解决方案二:http://arc

用System.Web.HttpRuntime.Cache保存DataSet,有时取出来的时候发现Dataset里面的数据有些丢失了。

问题描述 用System.Web.HttpRuntime.Cache保存DataSet,有时取出来的时候发现Dataset里面的数据有些丢失了.不知道什么原因.现在还没有跟踪到是否整个DataSet都丢失了,在网上搜了一下相关文章,都说资源紧张的时候,系统有可能会回收Cache,但是为什么只丢失部分数据呢? 解决方案 解决方案二:帮顶是不是其他代码问题?解决方案三:看一下缓存的时间是否过期了解决方案四:HttpRuntime.Cache.Add("KEY",value,null,Cac

sqlserver中主键的标示规范设为‘是’后,当删除其中一行后,后面的主键如何重新排序?(如图)

问题描述 sqlserver中主键的标示规范设为'是'后,当删除其中一行后,后面的主键如何重新排序?(如图) sqlserver中主键的标示规范设为'是'后,当删除其中一行后,后面的主键如何从新排序?(如图) 如上图当将第3第4行删除后如何将第5行的主键编号重新编号为3? 解决方案 一行删掉就是删掉了,不用重新排序.排序是做查询的时候才做的事情. 解决方案二: 如果想要实现排序 就不要用自增长列 你把id设置为每次都插入现有id最大的加1 当删除的时候,将所有大于删除行id的其余行的id全部减1

ASP.NET组件System.Web.Optimization原理及缓存问题详解_实用技巧

1]开篇介绍 这篇文章将简单的分析一下有关静态文件捆绑的ASP.NET组件System.Web.Optimization的运行原理及基本的缓存问题: 在我们的项目里面充斥着很多静态文件,为了追求模块化.插件化很多静态文件都被设计成模块的方式或者被分解,在需要的时候在通过组合的方式在UI层上使用:这就带来一个问题,文件多了会影响浏览器加载页面的速度,而且由于浏览器的并发限制,对于并行的请求不是无限制的,所以捆绑静态文件的功能就产生:其实在以前,IIS还没有集成管道模型的时候我们只能通过动态资源的方

在.NET 应用程序中用System.Web.Mail 发送电子邮件

web|程序 在.NET 应用程序中用System.Web.Mail 发送电子邮件 作者:Mark Strawmyer日期:February 9, 2004 -------------------------------------------------------------------------------- 欢迎来到 .NET Nuts & Bolts 栏目.在这个栏目中,我们将探讨怎样在应用中发送电子邮件.这将用到System.Web.Mail 名字空间中的类. 协作数据对象Wind

用System.Web.Mail发送电子邮件

web 作者:Mark Strawmyer 日期:February 9, 2004   欢迎来到 .NET Nuts & Bolts 栏目.在这个栏目中,我们将探讨怎样在应用中发送电子邮件.这将用到System.Web.Mail 名字空间中的类. 协作数据对象Windows 2000 协作数据对象 (CDOSYS) 是微软用来创建和发送基于标准的电子邮件信息的消息组件.它是 用与 Windows NT的协作数据对象(CDONTS) 的替代物. 尽管由于向后兼容的原因 CDONTS 已包含在 Wi