浅谈cache的不正确用法

fanliang11 2008-06-13 08:49:34
有很多程序员都用cache对象进行数据缓存.想必大家都是这样写的吧,cache.Insert ("temp", value).你们想没想过设置缓存失效时间.其实正确的写法也就是
 cache.Add("temp", value, null,DateTime.Now.AddMinutes(60), TimeSpan.Zero, CacheItemPriority.High, null);

每次写怎么一长串代码是不是很累..其实可以偷懒写个通用缓存类,代码如下:

///<summary>
//作用:缓存
///作者: 范亮(fanliang11)转贴请注明原作者
///编写日期: 2008-6-13
///</summary>
using System;
using System.Collections.Generic;
using System.Collections;
using System.Text;
using System.Web;
using System.Web.Caching;
using System.Data;

namespace test
{
/// <summary>
/// 缓存类

/// </summary>
public class CommonCache
{
#region 构造函数
/// <summary>
/// 静态构造函数
/// </summary>
static CommonCache()
{
}
#endregion


#region 属性定义
/// <summary>
/// 失效时间单位为分钟
/// </summary>
public static int LoseTime
{
set
{
mLoseTime = value;
}
}


#endregion


#region 公共方法

/// <summary>
/// 获取值
/// </summary>
/// <param name="pKey">键值名</param>
/// <returns>返回键值</returns>
public static object GetValue(object pKey)
{
object retValue = null;
lock (mCache.SyncRoot)
{
try
{
if (mCache.ContainsKey(pKey))
{
retValue=mCache[pKey];
IList<object> valueArr = (IList<object>)retValue;
DateTime dt = Convert.ToDateTime(valueArr[0]);
if (dt.CompareTo(DateTime.Now) < 0)
{
retValue = null;
}
else
{
retValue = valueArr[1];
}

}
else
{
retValue = null;
}
}
catch (Exception e)
{
retValue = null;
}
}
return retValue;
}


/// <summary>
/// 设置值
/// </summary>
/// <param name="pKey">键值名</param>
/// <param name="pValue">键值</param>
public static void SetValue(object pKey, object pValue)
{
IList<object> valueArr = new List<object>() ;
valueArr.Add (DateTime.Now.AddMinutes(mLoseTime));
valueArr.Add ( pValue);

lock (mCache.SyncRoot)
{
try
{
if (!mCache.ContainsKey(pKey))
{
mCache.Add(pKey, valueArr);
}
else
{
mCache[pKey] = valueArr;
}
}
catch (Exception e)
{
}
}
}
#endregion


#region 字段定义
/// <summary>
/// 缓存对象
/// </summary>
private static Hashtable mCache = new Hashtable();

/// <summary>
/// 失效时间(单位:分钟)
/// </summary>
private static int mLoseTime = 60;
#endregion
}
}

大家有什么其它的好方法可以写出来..如对程序有任何意见..请联系作者QQ:137629448
...全文
453 50 打赏 收藏 转发到动态 举报
写回复
用AI写文章
50 条回复
切换为时间正序
请发表友善的回复…
发表回复
cxynupc 2010-11-30
  • 打赏
  • 举报
回复
这点东西还要写个类,无语
vrhero 2008-06-15
  • 打赏
  • 举报
回复
哗众取宠的标题...
fanliang11 2008-06-15
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 LikeCode 的回复:]
楼主你凭什么说是错误的, 理由, 原因, 这些是关键, 你不能一句话就说错误, 这样没有人信服你的.
请给出理由和原因.
[/Quote]
先搞清楚了..不正确和错误是两回事...而我提出的是设置缓存失效时间的写法..以提高性能的提升..
LikeCode 2008-06-15
  • 打赏
  • 举报
回复
楼主你凭什么说是错误的, 理由, 原因, 这些是关键, 你不能一句话就说错误, 这样没有人信服你的.
请给出理由和原因.
popeyepower 2008-06-15
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 sp1234 的回复:]
引用楼主 fanliang11 的帖子:
有很多程序员都用cache对象进行数据缓存.想必大家都是这样写的吧,cache.Insert ("temp", value).你们想没想过设置缓存失效时间.其实正确的写法也就是

C# code cache.Add("temp", value, null,DateTime.Now.AddMinutes(60), TimeSpan.Zero, CacheItemPriority.High, null);



没有什么理由说明前者是“错误”,只有后者是“正确”的。如果明确设置缓存依赖项,是出于明确需要设置缓存依…
[/Quote]

既然微软提供了前者的方法,那前者的写法就不能叫错误的.
但是从使用的角度来说,我想大多数人不用后者的写法,并不是希望服务器根据内存去管理缓存失效,而是不知道这种写法. 当然楼主提出这种方法以后很多人的程序可能会因此得到性能上的提升,但是说成是写法错误也太过片面.
fanliang11 2008-06-15
  • 打赏
  • 举报
回复
大家有时间可以看看这位专家的博客..很不错..呵呵..
http://diary.tw/tim/tag/Add
whb147 2008-06-15
  • 打赏
  • 举报
回复
学习了
fanliang11 2008-06-15
  • 打赏
  • 举报
回复
还有一种写法是直接Cache["temp"] = "测试"直接这样写
这种做法将在缓存中存储项,同时不带任何依赖项,因此它不会到期,除非缓存引擎为了给其他缓存数据提供空间而将其删除。
而我说了cache.Insert ("temp", value)是不正确的写法和Cache["temp"] = "测试"这样写没什么两样..还有当有大量数据的时候..请选用ADD方法..以下从MSDN理解出来的:
再進行資料的 Cache 寫入, 然而寫入的方式有兩種, 一種為 Insert , 一種為 Add , 其中差異不少, Insert 方法有幾種不同的排列組合外, 尚有可以一直覆寫的功能, 也就是說, 在利用相同的 key 去 Insert 時, 他會利用最新的資料去覆寫掉原來的資料, 而 Add 方法則是不會覆寫, 也就是 Add 會加不進去, 但也不會產生什 錯誤, 呼叫完 Add 方法後, 若該 Cache 的 data 仍為有效, 則將該 Cache 的 object 傳回, 而且不異常原來的 Cache 方式.

上面的述描對於一般的應用都沒太大影響, 反而是 Insert 方法的彈性比較大, 不過由於 Insert 方法會有覆寫的問題, 所以若是大量訪問的網問上, 應該效能會略遜於 Add 方法
mengxj85 2008-06-15
  • 打赏
  • 举报
回复
学习加收藏,感谢楼主
LikeCode 2008-06-15
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 sp1234 的回复:]
引用楼主 fanliang11 的帖子:
有很多程序员都用cache对象进行数据缓存.想必大家都是这样写的吧,cache.Insert ("temp", value).你们想没想过设置缓存失效时间.其实正确的写法也就是

C# code cache.Add("temp", value, null,DateTime.Now.AddMinutes(60), TimeSpan.Zero, CacheItemPriority.High, null);



没有什么理由说明前者是“错误”,只有后者是“正确”的。如果明确设置缓存依赖项,是出于明确需要设置缓存依赖的…
[/Quote]

同意sp1234这种看法.
ws_hgo 2008-06-15
  • 打赏
  • 举报
回复
谢谢
LZ
amandag 2008-06-14
  • 打赏
  • 举报
回复
放进我的网摘
datahandler2 2008-06-14
  • 打赏
  • 举报
回复
没什么好谈的。支持下
无非就是cache 的api缓存策略代码
stning 2008-06-14
  • 打赏
  • 举报
回复
谢谢楼主分享
zero8500 2008-06-14
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 zero8500 的回复:]
在顶一下
[/Quote]
zero8500 2008-06-14
  • 打赏
  • 举报
回复
在顶一下
zero8500 2008-06-14
  • 打赏
  • 举报
回复

挺好,谢谢楼主分享
hy_lihuan 2008-06-14
  • 打赏
  • 举报
回复
没有什么理由说明前者是“错误”,只有后者是“正确”的。如果明确设置缓存依赖项,是出于明确需要设置缓存依赖的目的,。如果不设置,则是由Cache系统自己根据服务器内存情况自己管理依赖,这并没有错误。或许许多人不知道如何明确设置缓存依赖,但是并不是只有这样做才正确。


就是这个说法
  • 打赏
  • 举报
回复
[Quote=引用楼主 fanliang11 的帖子:]
有很多程序员都用cache对象进行数据缓存.想必大家都是这样写的吧,cache.Insert ("temp", value).你们想没想过设置缓存失效时间.其实正确的写法也就是

C# code cache.Add("temp", value, null,DateTime.Now.AddMinutes(60), TimeSpan.Zero, CacheItemPriority.High, null);

[/Quote]

没有什么理由说明前者是“错误”,只有后者是“正确”的。如果明确设置缓存依赖项,是出于明确需要设置缓存依赖的目的,。如果不设置,则是由Cache系统自己根据服务器内存情况自己管理依赖,这并没有错误。或许许多人不知道如何明确设置缓存依赖,但是并不是只有这样做才正确。
fanliang11 2008-06-14
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 wangjun8868 的回复:]
写完了
怎么掉用?
[/Quote]
if(test.CommonCache.GetValue("TESTS")==null)
{
TextBox1.Text = "测试缓存程序.缓存为null";
test.CommonCache.SetValue("TESTS", "测试缓存程序");
}
else
{
TextBox1.Text = test.CommonCache.GetValue("TESTS").ToString();
}
加载更多回复(29)

62,073

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧