仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 548|回复: 8
打印 上一主题 下一主题

[学习教程] 来一篇关于NET的ASP.NET功能优化之构建自界说文件缓存

[复制链接]
第二个灵魂 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 14:22:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
我之所以想学。NET,是因为一直觉的BILLGATES好厉害,希望有一天能去微软,虽然现在还距离遥远,呵呵:)ASP.NET的输入缓存(即静态HTML)在.NET4.0前一向是基于内存的。这意味着假如我们的站点含有大批的缓存,则很简单损耗失落本机内存。如今,借助于.NET4.0中的OutputCacheProvider,我们能够有多种选择创立本人的缓存。如,我们能够把HTML输入缓存存储到memcached散布式集群服务器,大概MongoDB中(一种经常使用的面向文档数据库,无妨浏览本篇http://msdn.microsoft.com/zh-cn/magazine/gg650661.aspx)。固然,我们也能够把缓存作为文件存储到硬盘上,思索到可扩大性,这是一种最便宜的做法,本文就是先容假如构建自界说文件缓存。</P></p>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;
}
}
有两个中央必要出格申明:
在Add办法中,有一个前提判别,必需做出如许的处置,不然缓存机制将会缓存第一次的了局,过了无效期后缓存讲生效其实不再重修;
在示例程序中,我们复杂的将缓寄存到了Cache目次下,在实践的项目理论中,思索到缓存的页面将是不计其数的,以是我们必需要做目次分级,不然寻觅并读取缓存文件将会成为效力瓶颈,这会耗尽CPU。
3:设置文件
我们必要在Web.config中设置缓存处置程序是自界说的FileCacheProvider,即在<system.web>下增加节点:
<caching>
<outputCachedefaultProvider="FileCache">
<providers>
<addname="FileCache"type="MvcApplication2.Common.FileCacheProvider"cachePath="~/Cache"/>
</providers>
</outputCache>
</caching>
4:缓存的利用
我们假定在MVC的把持中利用(假如要在ASP.NET页面中利用,则在页面中包括<%@OutputCacheVaryByParam="none"Duration="10"%>),能够看到,Index是未举行输入缓存的,而Index2举行了输入缓存,缓存工夫为10秒。
publicclassHomeController:Controller
{
privatestaticreadonlyILoglog=LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
staticstrings_conn="DataSource=192.168.0.77;InitialCatalog=luminjidb;UserId=sa;Password=sa;";
publicActionResultIndex()
{
using(DataSetds=Common.SqlHelper.ExecuteDataset(s_conn,CommandType.Text,"selecttop1*fromNameTba,DepTbbwherea.DepID=b.IDORDERBYNEWID()"))
{
ViewBag.Message=ds.Tables[0].Rows[0]["name"].ToString();
}
returnView();
}
[OutputCache(Duration=10,VaryByParam="none")]
publicActionResultIndex2()
{
using(DataSetds=Common.SqlHelper.ExecuteDataset(s_conn,CommandType.Text,"selecttop1*fromNameTba,DepTbbwherea.DepID=b.IDORDERBYNEWID()"))
{
ViewBag.Message=ds.Tables[0].Rows[0]["name"].ToString();
}
returnView();
}
}
5:检察下效果
下面的代码,在会见了Index2后,将会在Cache文件夹下发生缓存文件,以下:
如今,我们入手下手评价下有输入缓存和无输入缓存的功能对照,摹拟100个用户并发1000次哀求以下:



能够看到,有输入缓存后,吞吐率分明进步了10倍。
效率会有不少的变化。而实际上java是基于堆栈机器来设计,这和我们常见的基于寄存器的本地机器是差异比较大的。总体来说,这是一种虚拟机的设计思路。
飘飘悠悠 该用户已被删除
沙发
发表于 2015-1-18 13:40:15 | 只看该作者
同时也感谢博客园给我们这个平台,也感谢博客园的编辑们做成专题引来这么多高人指点。
变相怪杰 该用户已被删除
板凳
发表于 2015-1-26 06:19:31 | 只看该作者
如今主流的Web服务器软件主要由IIS或Apache组成。IIS支持ASP且只能运行在Windows平台下,Apache支持PHP,CGI,JSP且可运行于多种平台,虽然Apache是世界使用排名第一的Web服务器平台。
飘灵儿 该用户已被删除
地板
发表于 2015-2-4 15:06:16 | 只看该作者
CGI程序在运行的时候,首先是客户向服务器上的CGI程序发送一个请求,服务器接收到客户的请求后,就会打开一个新的Process(进程)来执行CGI程序,处理客户的请求。CGI程序最后将执行的结果(HTML页面代码)传回给客户。
第二个灵魂 该用户已被删除
5#
 楼主| 发表于 2015-2-10 02:37:11 | 只看该作者
Servlet的形式和前面讲的CGI差不多,它是HTML代码和后台程序分开的。它们的启动原理也差不多,都是服务器接到客户端的请求后,进行应答。不同的是,CGI对每个客户请求都打开一个进程(Process)。
小妖女 该用户已被删除
6#
发表于 2015-2-28 17:51:57 | 只看该作者
逐步缩小出错代码段的范围,最终确定错误代码的位置。
小女巫 该用户已被删除
7#
发表于 2015-3-10 05:15:08 | 只看该作者
可以通过在现有ASP应用程序中逐渐添加ASP.NET功能,随时增强ASP应用程序的功能。ASP.NET是一个已编译的、基于.NET的环境,可以用任何与.NET兼容的语言(包括VisualBasic.NET、C#和JScript.NET.)创作应用程序。另外,任何ASP.NET应用程序都可以使用整个.NETFramework。开发人员可以方便地获得这些技术的优点,其中包括托管的公共语言运行库环境、类型安全、继承等等。
若相依 该用户已被删除
8#
发表于 2015-3-17 05:10:10 | 只看该作者
在asp.net虚拟主机的服务提供商中,目前首推的是CNNIC的其中一家域名注册机构---时代互联(www.now.net.cn),他们早在2001年微软刚推出Asp.net时就推出了对应的Asp.net虚拟主机了,经笔者的使用测试,他提供的Asp.net性能非常的稳定,版本也会定期的更新,目前他的
海妖 该用户已被删除
9#
发表于 2015-3-23 22:18:07 | 只看该作者
ASP是把代码交给VBScript解释器或Jscript解释器来解释,当然速度没有编译过的程序快了。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-18 11:08

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表