您现在的位置是:首页 > .NET

.NET

ASP.NET性能优化之构建自定义文件缓存

2020-11-20 10:39:13 .NET admin
ASP.NET的输出缓存(即静态HTML)在.NET4.0前一直是基于内存的。这意味着如果我们的站点含有大量的缓存,则很容易消耗掉本机内存。现在,借助于.NET4.0中的OutputCacheProvider,我们可以有多种选择创建自己的缓
ASP.NET的输出缓存(即静态HTML)在.NET4.0前一直是基于内存的。这意味着如果我们的站点含有大量的缓存,则很容易消耗掉本机内存。现在,借助于.NET4.0中的OutputCacheProvider,我们可以有多种选择创建自己的缓存。如,我们可以把HTML输出缓存存储到memcached分布式集群服务器,或者MongoDB中(一种常用的面向文档数据库,不妨阅读本篇http://msdn.microsoft.com/zh-cn/magazine/gg650661.aspx)。当然,我们也可以把缓存作为文件存储到硬盘上,考虑到可扩展性,这是一种最廉价的做法,本文就是介绍如果构建自定义文件缓存。

1:OutputCacheProvider

OutputCacheProvider是一个抽象基类,我们需要override其中的四个方法,它们分别是:

Add方法,将指定项插入输出缓存中。

Get方法,返回对输出缓存中指定项的引用。

Remove方法,从输出缓存中移除指定项。

Set方法,将指定项插入输出缓存中,如果该项已缓存,则覆盖该项。

2:创建自己的文件缓存处理类

该类型为FileCacheProvider,代码如下:


publicclassFileCacheProvider:OutputCacheProvider
{
privatestaticreadonlyILoglog=LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
 publicoverridevoidInitialize(stringname,NameValueCollectionattributes)
{
base.Initialize(name,attributes);
CachePath=HttpContext.Current.Server.MapPath(attributes["cachePath"]);
}
publicoverrideobjectAdd(stringkey,objectentry,DateTimeutcExpiry)
{
Objectobj=Get(key);
if(obj!=null)//这一步很重要
{
returnobj;
}
Set(key,entry,utcExpiry);
returnentry;
}
publicoverrideobjectGet(stringkey)
{
stringpath=ConvertKeyToPath(key);
if(!File.Exists(path))
{
returnnull;
}
CacheItemitem=null;
using(FileStreamfile=File.OpenRead(path))
{
varformatter=newBinaryFormatter();
item=(CacheItem)formatter.Deserialize(file);
}
if(item.ExpiryDate<=DateTime.Now.ToUniversalTime())
{
log.Info(item.ExpiryDate+"*"+key);
Remove(key);
returnnull;
}
returnitem.Item;
}
publicoverridevoidSet(stringkey,objectentry,DateTimeutcExpiry)
{
CacheItemitem=newCacheItem(entry,utcExpiry);
stringpath=ConvertKeyToPath(key);
using(FileStreamfile=File.OpenWrite(path))
{
BinaryFormatterformatter=newBinaryFormatter();
formatter.Serialize(file,item);
}
}
publicoverridevoidRemove(stringkey)
{
stringpath=ConvertKeyToPath(key);
if(File.Exists(path))
File.Delete(path);
}
publicstringCachePath
{
get;
set;
}
privatestringConvertKeyToPath(stringkey)
{
stringfile=key.Replace('/','-');
file+=".txt";
returnPath.Combine(CachePath,file);
}
}
[Serializable]
publicclassCacheItem
{
publicDateTimeExpiryDate;
publicobjectItem;
publicCacheItem(objectentry,DateTimeutcExpiry)
{
Item=entry;
ExpiryDate=utcExpiry;
}
}