实现功能:定时刷新Cache
错误理解:在使用Cache前,我个人理解是Cache会提供一个定时执行的方法。比如每隔10分钟执行一项任务,而这个任务就要刷新Cache。看MSDN上的文档绕了很久才明白,是对参数的理解错误了。
MSDN示例:链接
理解事项:
1. 使用Cache.Add 方法要先检查Cache[“Key”] (要添加的Key)是否存在,如果存在 Add时会报错(未验证),如果用Cache.Insert 方法则会更新当前Cache[“Key”] 。
2. Cache.Add(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemPriority priority, CacheItemRemovedCallback onRemoveCallback);。其中 C#缓存absoluteExpiration、slidingExpiration两个参数的疑惑,absoluteExpiration:用于设置绝对过期时间,它表示只要时间一到就过期,所以类型为System.DateTime,当给这个参数设置了一个时间时,slidingExpiration参数的值就只能为Cache.NoSlidingExpiration,否则出错;slidingExpiration:用于设置可调过期时间,它表示当离最后访问超过某个时间段后就过期,所以类型为System.TimeSpan,当给这个参数设置了一个时间段时,absoluteExpiration的值就只能为Cache.NoAbsoluteExpiration,否则出错;
3. Cache.Add的参数 CacheItemRemovedCallback onRemoveCallback
是 从删除缓存项时的回调方法,删除操作包括:1,Cache.Remove(“Key1”) 操作 2,Cache的Expire过期值到了。而我错我的理解是认为:我要的功能是定时更新,第3、4个参数可设置定时,可 更新(Update)怎么和移除(Remove)联系起来呢? 正确的理解应该是:当Cache过期了 或者被移除了的时候,Cache会自定去执行指定的委托,在这个委托关联的方法里可以根据需要实现如何刷新Cache。MSDN说明 。Cache["Key1"] = null;
将报错,Cache[“Key1”] 值不能为 null。
4. 促使我理解的链接:从缓存中移除项时通知应用程序。里面提到了缓存处理方案,也就是实例,这才能明白。
5. Cache.Insert的方法最后参数类型 CacheItemUpdateCallback表示:Cache项删除前要做的操作(理解上类似SqlServer中的Inserted、Deleted)。
6. .NET API MSDN链接 。
下面代码说明:
1. 要执行代码,可创建Web空项目,添加一个web窗体,并见代码复制到里面。
2. AddItemToCache()方法执行时,会添加一个key为”Key1”,value为”Value 1”的Cache,并设置当过期时间为60秒,当过期时或被移除时执行CacheItemRemovedCallback 委托关联的RemovedCallback方法。
<html>
<Script runat=server language="C#">
// <snippet2>
static bool itemRemoved = false;
static CacheItemRemovedReason reason;
CacheItemRemovedCallback onRemove = null;
public void RemovedCallback(String k, Object v, CacheItemRemovedReason r){
itemRemoved = true;
reason = r;
}
// </snippet2>
// <snippet3>
public void AddItemToCache(Object sender, EventArgs e) {
itemRemoved = false;
onRemove = new CacheItemRemovedCallback(this.RemovedCallback);
if (Cache["Key1"] == null)
Cache.Add("Key1", "Value 1", null, DateTime.Now.AddSeconds(60), Cache.NoSlidingExpiration, CacheItemPriority.High, onRemove);
}
// </snippet3>
// <snippet4>
public void RemoveItemFromCache(Object sender, EventArgs e) {
if(Cache["Key1"] != null)
Cache.Remove("Key1");
}
// </snippet4>
</Script>
<body>
<Form runat="server">
<input type=submit OnServerClick="AddItemToCache" value="Add Item To Cache" runat="server"/>
<input type=submit OnServerClick="RemoveItemFromCache" value="Remove Item From Cache" runat="server"/>
</Form>
<% if (itemRemoved) {
Response.Write("RemovedCallback event raised.");
Response.Write("<BR>");
Response.Write("Reason: <B>" + reason.ToString() + "</B>");
}
else {
// <snippet5>
Response.Write("Value of cache key: <B>" + Server.HtmlEncode(Cache["Key1"] as string) + "</B>");
// </snippet5>
}
%>
</body>
</html>