分离Nt discuz2.0缓存模块

因为nt discuz 用的是缓存和xml做映射

我换成了容器去做映射,感觉效率会更高点。 

先附上代码 

这是个缓存是否存在的枚举 

 

//枚举缓存标志位类型
enum CacheFlag
{
    Cachefails,     
//缓存失败
    CacheNoData,   //缓存中无数据
    CacheHaveData  //缓存中有数据
}
 

 

以下是对映射控制,我用了个跨web园的Dictionary来控制,里面有两个键分别为缓存id和最后更新时间。 

 

 

  1/// <summary>
  2/// 映射控制
  3/// </summary>

  4class CacheFlagHelper
  5{
  6    //简单映射
  7    private volatile static Dictionary<string, DateTime> cacheFlagDictionary = new Dictionary<string, DateTime>();
  8
  9    /// <summary>
 10    /// 映射中是否存在
 11    /// </summary>
 12    /// <param name="objId"></param>
 13    /// <returns></returns>

 14    public static CacheFlag IfExistCache(string objId) 
 15    {
 16        try
 17        {
 18            if (cacheFlagDictionary.ContainsKey(objId))
 19            {
 20                return CacheFlag.CacheHaveData;
 21            }

 22            else
 23            {
 24                return CacheFlag.CacheHaveData;
 25            }

 26        }

 27        catch
 28        
 29            return CacheFlag.Cachefails;
 30        }

 31    }

 32
 33    /// <summary>
 34    /// 更改最新修改时间
 35    /// </summary>
 36    /// <param name="objId"></param>
 37    /// <returns></returns>

 38    public static void ReplaceLastChangeTime(string objId)
 39    {
 40        if (IfExistCache(objId) == CacheFlag.CacheHaveData )
 41        {
 42            cacheFlagDictionary["objId"= DateTime.Now;
 43        }

 44    }

 45
 46    /// <summary>
 47    /// 添加最新修改时间
 48    /// </summary>
 49    /// <param name="objId"></param>
 50    /// <returns></returns>

 51    public static void AddCacheFlag(string objId)
 52    {
 53        if (IfExistCache(objId) != CacheFlag.CacheHaveData)
 54        {
 55            cacheFlagDictionary.Add(objId,DateTime.Now);
 56        }

 57    }

 58
 59    /// <summary>
 60    /// 删除映射
 61    /// </summary>
 62    /// <param name="objId"></param>
 63    /// <returns></returns>

 64    public static void RemoveCacheFlag(string objId)
 65    {
 66        if (IfExistCache(objId) == CacheFlag.CacheHaveData)
 67        {
 68            cacheFlagDictionary.Remove(objId);
 69        }

 70    }

 71}

 72
 73 
 74
 75//接下来是对缓存本身 
 76
 77/// <summary>
 78/// 缓存控制
 79/// </summary>

 80public class CacheCollection
 81{
 82    protected static volatile System.Web.Caching.Cache webCache = System.Web.HttpRuntime.Cache;
 83    protected int _timeOut = 1440// 默认缓存存活期为1440分钟(24小时)
 84
 85    //设置到期相对时间[单位:/分钟] 
 86    public int TimeOut
 87    {
 88        set { _timeOut = value > 0 ? value : 6000; }
 89        get return _timeOut > 0 ? _timeOut : 6000; }
 90    }

 91
 92    public static System.Web.Caching.Cache GetWebCacheObj
 93    {
 94        get return webCache; }
 95    }

 96
 97    public void AddObject(string objId, object o)
 98    {
 99        CacheItemRemovedCallback callBack = new CacheItemRemovedCallback(onRemove);
100        webCache.Insert(objId, o, null, System.DateTime.Now.AddHours(TimeOut), System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.High, callBack);
101  
102    }

103
104    //建立回调委托的一个实例
105    public void onRemove(string key, object val, CacheItemRemovedReason reason)
106    {
107        //建立映射
108        CacheFlagHelper.AddCacheFlag(key);//暂时为了数据统一
109
110        switch (reason)
111        {
112            case CacheItemRemovedReason.DependencyChanged:
113                break;
114            case CacheItemRemovedReason.Expired:
115                {
116                    break;
117                }

118            case CacheItemRemovedReason.Removed:
119                {
120                    break;
121                }

122            case CacheItemRemovedReason.Underused:
123                {
124                    break;
125                }

126            defaultbreak;
127        }

128    }

129
130    /// <summary>
131    /// 返回一个指定的对象
132    /// </summary>
133    /// <param name="objId">对象的关键字</param>
134    /// <returns>对象</returns>

135    public object RetrieveObject(string objId)
136    {
137        if (objId == null || objId.Length == 0)
138        {
139            return null;
140        }

141
142        return webCache.Get(objId);
143    }

144
145    /// <summary>
146    /// 删除缓存对象
147    /// </summary>
148    /// <param name="objId">对象的关键字</param>

149    public void RemoveObject(string objId)
150    {
151        if (objId == null || objId.Length == 0)
152        {
153            return;
154        }

155        webCache.Remove(objId);
156        CacheFlagHelper.RemoveCacheFlag(objId); //暂时为了数据统一
157    }

158
159}

160

 

备注:

如果仅仅一个实现的话那就只需要CacheCollection一个类删去我红色的两句,就OK了。

如果需要做映射,那就需要多写一个策略类来根据映射控制缓存。在策略类封装逻辑。 

OK,写一个简单的Clint实现

 

 

CacheCollection ct = new CacheCollection();
        ct.AddObject(
"a""aaa");
        
object o = ct.RetrieveObject("a"as object;
        ct.RemoveObject(
"a");

是不是相当方便呀?呵呵

 

PS,我看了Cache类,里面貌似没有一个判断存在不存在的方法,而且直接对整个缓存做控制有中冗大,臃肿的感觉。

所以用上映射,线条就清晰一点 

如上为稚见,希望大家批评指正。

posted on 2008-08-13 18:08  灯灯  阅读(781)  评论(2)    收藏  举报

导航