分离Nt discuz2.0缓存模块
因为nt discuz 用的是缓存和xml做映射
我换成了容器去做映射,感觉效率会更高点。
先附上代码
这是个缓存是否存在的枚举
//枚举缓存标志位类型
enum CacheFlag
{
Cachefails, //缓存失败
CacheNoData, //缓存中无数据
CacheHaveData //缓存中有数据
}
以下是对映射控制,我用了个跨web园的Dictionary来控制,里面有两个键分别为缓存id和最后更新时间。
1
/// <summary>
2
/// 映射控制
3
/// </summary>
4
class 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>
80
public 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
default: break;
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
/// <summary>2
/// 映射控制3
/// </summary>4
class CacheFlagHelper5
{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
try17
{18
if (cacheFlagDictionary.ContainsKey(objId))19
{20
return CacheFlag.CacheHaveData;21
}22
else23
{24
return CacheFlag.CacheHaveData;25
}26
}27
catch28
{ 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>80
public class CacheCollection81
{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 TimeOut87
{88
set { _timeOut = value > 0 ? value : 6000; }89
get { return _timeOut > 0 ? _timeOut : 6000; }90
}91

92
public static System.Web.Caching.Cache GetWebCacheObj93
{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
default: break;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类,里面貌似没有一个判断存在不存在的方法,而且直接对整个缓存做控制有中冗大,臃肿的感觉。
所以用上映射,线条就清晰一点
如上为稚见,希望大家批评指正。


浙公网安备 33010602011771号