当前位置: 代码迷 >> ASP.NET >> ASP.NET 缓存有效时间设置解决思路
  详细解决方案

ASP.NET 缓存有效时间设置解决思路

热度:1404   发布时间:2013-02-25 00:00:00.0
ASP.NET 缓存有效时间设置
实现:从添加缓存时间开始,5秒钟后清除该缓存或缓存失效

示例:
C# code
    //循环添加数据到cache    protected void Button1_Click(object sender, EventArgs e)    {        for (int i = 1; i < 5; i++)        {            SetValues(i.ToString(), Convert.ToString(i + 1)); //循环添加 4行数据        }    }    //使用Cache记录数据    public void SetValues(string val1, string val2)    {        if (HttpContext.Current.Cache["test"] != null) //缓存存在        {            DataTable dtLis = (DataTable)HttpContext.Current.Cache["test"];            DataRow dr1 = dtLis.NewRow();            dr1[0] = val1;            dr1[1] = val2;            dtLis.Rows.Add(dr1);            HttpContext.Current.Cache["test"] = dtLis; //使用cache保存记录        }        else        {            DataTable dtLis = new DataTable();            dtLis.Columns.Add("Company", typeof(string));            dtLis.Columns.Add("Department", typeof(string));            DataRow dr1 = dtLis.NewRow();            dr1[0] = val1;            dr1[1] = val2;            dtLis.Rows.Add(dr1);            //添加缓存,并且5秒后过期            Cache.Insert("test", dtLis, null, DateTime.Now.AddMinutes(5), Cache.NoSlidingExpiration);            dtLis.Clear();        }    }    //获取缓存    protected void Button2_Click(object sender, EventArgs e)    {        if (HttpContext.Current.Cache["test"] != null)        {            DataTable dt = (DataTable)HttpContext.Current.Cache["test"];            Response.Write(dt.Rows.Count.ToString());        }        else            Response.Write("this cache is null");    }


以上是我的实现代码,问题是缓存总是存在,隔了5秒后,再获取还是原来的值,并不是null。

问:如何清除掉它啊,设置它5秒后过期。


------解决方案--------------------------------------------------------
抢沙发。。。。。顶缓存知识
------解决方案--------------------------------------------------------
思考中..............
------解决方案--------------------------------------------------------
非常想学习

------解决方案--------------------------------------------------------
DateTime.Now.AddMinutes(5)


你这是五分钟。。。不是五秒
------解决方案--------------------------------------------------------
C# code
if (HttpContext.Current.Cache["test"] != null) //缓存存在        {            DataTable dtLis = (DataTable)HttpContext.Current.Cache["test"];            DataRow dr1 = dtLis.NewRow();            dr1[0] = val1;            dr1[1] = val2;            dtLis.Rows.Add(dr1);                        //如果缓存存在 直接取缓存中的数据  为什么要再一次的给缓存赋值呢??不懂。。。             HttpContext.Current.Cache["test"] = dtLis; //使用cache保存记录        }
------解决方案--------------------------------------------------------
如果缓存存在 ,你再一次的给Cache["test"]赋值, 缓存中的值是你后来给的最新的值 而你创建缓存时候给的值 就被换掉了,导致你设置缓存失效时间 无效。
------解决方案--------------------------------------------------------
C# code
using System;using System.Web.Caching;using System.Web;using System.Collections;using System.Text.RegularExpressions;/// <summary>    /// 缓存常用操作    /// LastEditTime:2011-10-10    /// </summary>    public class CacheUtil    {        public CacheUtil()        {            //...在此处添加构造函数逻辑        }        /// <summary>        /// 增加一个缓存对象        /// </summary>        /// <param name="strKey">键值名称</param>        /// <param name="valueObj">被缓存对象</param>        /// <param name="durationMin">缓存失效时间,默认为3分钟</param>        /// <param name="priority">保留优先级(枚举数值),1最不会被清除,6最容易被内存管理清除,0为default        /// 【1:NotRemovable;2:High;3:AboveNormal;4:Normal;5:BelowNormal;6:Low】</param>        /// <returns>缓存写入是否成功true 、 false</returns>        public static bool InsertCach(string strKey, object valueObj, int durationMin, int priority)        {            TimeSpan ts;            if (strKey != null && strKey.Length != 0 && valueObj != null)            {                //建立回调委托的一个实例                //onRemove是委托执行的函数,具体方法看下面的onRemove(...)                CacheItemRemovedCallback callBack = new CacheItemRemovedCallback(onRemove);                #region 失效时间设置                if (durationMin == 0)                {                    ts = new TimeSpan(0, 3, 0);//如果不进行设置则为三分钟                }                else                {                    ts = new TimeSpan(0, durationMin, 0);                }                #endregion                #region System.Web.Caching.Cache 对象中存储的项的相对优先级                CacheItemPriority cachePriority;                switch (priority)                {                    case 6:                        cachePriority = CacheItemPriority.Low;                        break;                    case 5:                        cachePriority = CacheItemPriority.BelowNormal;                        break;                    case 4:                        cachePriority = CacheItemPriority.Normal;                        break;                    case 3:                        cachePriority = CacheItemPriority.AboveNormal;                        break;                    case 2:                        cachePriority = CacheItemPriority.High;                        break;                    case 1:                        cachePriority = CacheItemPriority.NotRemovable;                        break;                    default:                        cachePriority = CacheItemPriority.Default;                        break;                }                #endregion                HttpContext.Current.Cache.Insert(strKey, valueObj, null, DateTime.Now.Add(ts), System.Web.Caching.Cache.NoSlidingExpiration, cachePriority, callBack);                return true;            }            else            {                return false;            }        }        /// <summary>        /// 判断缓存对象是否存在        /// </summary>        /// <param name="strKey">缓存键值名称</param>        /// <returns>是否存在true 、false</returns>        public static bool IsExist(string strKey)        {            return HttpContext.Current.Cache[strKey] != null;        }        /// <summary>        /// 读取缓存对象        /// </summary>        /// <param name="strKey">缓存键值名称</param>        /// <returns>缓存对象,objec类型</returns>        public static object GetCache(string strKey)        {//取出值            if (HttpContext.Current.Cache[strKey] != null)            {                object obj = HttpContext.Current.Cache[strKey];                if (obj == null)                {                    return null;                }                else                {                    return obj;                }            }            else            {                return null;            }        }        /// <summary>        /// 删除缓存对象        /// </summary>        /// <param name="strKey">缓存键值名称</param>        public static void Remove(string strKey)        {            if (HttpContext.Current.Cache[strKey] != null)            {                HttpContext.Current.Cache.Remove(strKey);            }        }        /// <summary>        /// 根据设置的正则表达式清除缓存对象;        /// 该方法使用正则匹配要删除的键值对象,如果键值命名统一规范,可批处理清除相关缓存数据O(∩_∩)O        /// </summary>        /// <param name="pattern">匹配键值的正则表达式</param>        public static void RemoveByRegexp(string pattern)        {            if (pattern != "")            {                IDictionaryEnumerator enu = HttpContext.Current.Cache.GetEnumerator();                while (enu.MoveNext())                {                    string key = enu.Key.ToString();                    if (Regex.IsMatch(key, pattern))                    {                        Remove(key);                    }                }            }        }        /// <summary>        /// 清除所有缓存对象        /// </summary>        public static void Clear()        {            IDictionaryEnumerator enu = HttpContext.Current.Cache.GetEnumerator();            while (enu.MoveNext())            {                Remove(enu.Key.ToString());            }        }        public static CacheItemRemovedReason reason;        /// <summary>        /// 此方法在值失效之前调用,可以用于在失效之前更新数据库,或从数据库重新获取数据        /// </summary>        /// <param name="strKey"></param>        /// <param name="obj"></param>        /// <param name="reason"></param>        private static void onRemove(string strKey, object obj, CacheItemRemovedReason r)        {            reason = r;        }    }
  相关解决方案