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

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,代码如下:

  1. public class FileCacheProvider : OutputCacheProvider  
  2. {  
  3. private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);  
  4.  public override void Initialize(string name, NameValueCollection attributes)  
  5. {  
  6. base.Initialize(name, attributes);  
  7. CachePath = HttpContext.Current.Server.MapPath(attributes["cachePath"]);  
  8. }  
  9. public override object Add(string key, object entry, DateTime utcExpiry)  
  10. {  
  11. Object obj = Get(key);  
  12. if (obj != null//这一步很重要  
  13. {  
  14. return obj;  
  15. }  
  16. Set(key,entry,utcExpiry);  
  17. return entry;  
  18. }  
  19. public override object Get(string key)  
  20. {  
  21. string path = ConvertKeyToPath(key);  
  22. if (!File.Exists(path))  
  23. {  
  24. return null;  
  25. }  
  26. CacheItem item = null;  
  27. using (FileStream file = File.OpenRead(path))  
  28. {  
  29. var formatter = new BinaryFormatter();  
  30. item = (CacheItem)formatter.Deserialize(file);  
  31. }  
  32. if (item.ExpiryDate <= DateTime.Now.ToUniversalTime())  
  33. {  
  34. log.Info(item.ExpiryDate + "*" + key);  
  35. Remove(key);  
  36. return null;  
  37. }  
  38. return item.Item;  
  39. }  
  40. public override void Set(string key, object entry, DateTime utcExpiry)  
  41. {  
  42. CacheItem item = new CacheItem(entry, utcExpiry);  
  43. string path = ConvertKeyToPath(key);  
  44. using (FileStream file = File.OpenWrite(path))  
  45. {  
  46. BinaryFormatter formatter = new BinaryFormatter();  
  47. formatter.Serialize(file, item);  
  48. }  
  49. }  
  50. public override void Remove(string key)  
  51. {  
  52. string path = ConvertKeyToPath(key);  
  53. if (File.Exists(path))  
  54. File.Delete(path);  
  55.  }  
  56. public string CachePath  
  57. {  
  58. get;  
  59. set;  
  60. }  
  61. private string ConvertKeyToPath(string key)  
  62. {  
  63. string file = key.Replace('/''-');  
  64. file += ".txt";  
  65. return Path.Combine(CachePath, file);  
  66. }  
  67. }  
  68. [Serializable]  
  69. public class CacheItem  
  70. {  
  71. public DateTime ExpiryDate;  
  72. public object Item;  
  73. public CacheItem(object entry, DateTime utcExpiry)  
  74. {  
  75. Item = entry;  
  76. ExpiryDate = utcExpiry;  
  77. }  

有两个地方需要特别说明:

在Add方法中,有一个条件判断,必须做出这样的处理,否则缓存机制将会缓存第一次的结果,过了有效期后缓存讲失效并不再重建;

在示例程序中,我们简单的将缓存放到了Cache目录下,在实际的项目实践中,考虑到缓存的页面将是成千上万的,所以我们必须要做目录分级,否则寻找并读取缓存文件将会成为效率瓶颈,这会耗尽CPU。

3:配置文件

我们需要在Web.config中配置缓存处理程序是自定义的FileCacheProvider,即在 <system.web>下添加节点:

  1. <caching>  
  2. <outputCache defaultProvider="FileCache">  
  3. <providers>  
  4. <add name="FileCache" type="MvcApplication2.Common.FileCacheProvider" cachePath="~/Cache" />  
  5. </providers>  
  6. </outputCache>  
  7.  </caching> 

4:缓存的使用

我们假设在MVC的控制中使用(如果要在ASP.NET页面中使用,则在页面中包含<%@OutputCache VaryByParam="none" Duration="10" %>),可以看到,Index是未进行输出缓存的,而Index2进行了输出缓存,缓存时间为10秒。

  1. public class HomeController : Controller  
  2. {  
  3. private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);  
  4. static string s_conn = "Data Source=192.168.0.77;Initial Catalog=luminjidb;User Id=sa;Password=sa;";  
  5. public ActionResult Index()  
  6. {  
  7. using (DataSet ds = Common.SqlHelper.ExecuteDataset(s_conn, CommandType.Text, "select top 1* from NameTb a, DepTb b where a.DepID = b.ID ORDER BY NEWID()"))  
  8. {  
  9. ViewBag.Message = ds.Tables[0].Rows[0]["name"].ToString();  
  10. }  
  11. return View();  
  12. }  
  13. [OutputCache(Duration = 10, VaryByParam = "none")]  
  14. public ActionResult Index2()  
  15. {  
  16. using (DataSet ds = Common.SqlHelper.ExecuteDataset(s_conn, CommandType.Text, "select top 1* from NameTb a, DepTb b where a.DepID = b.ID ORDER BY NEWID()"))  
  17. {  
  18. ViewBag.Message = ds.Tables[0].Rows[0]["name"].ToString();  
  19. }  
  20. return View();  
  21. }  

5:查看下效果

上面的代码,在访问了Index2后,将会在Cache文件夹下产生缓存文件,如下:

现在,我们开始评价下有输出缓存和无输出缓存的性能对比,模拟100个用户并发1000次请求如下:

可以看到,有输出缓存后,吞吐率明显提高了10倍。

6:代码下载

FileCacheProvider的原始代码来自于网络,我修改了其中的BUG,全部代码下载如下:MvcApplication20110907.rar

职业指导:

在使用某一技能三个月后,你还不是专家,即便使用时间是三年,你还不是。马尔科姆·格莱德威尔在《异类》一书中指出,成为一名真正的专家,需要10000小时。10000小时!如果一天用10小时,每天都学习,则大概需要3年时间。如果一天5小时,一年学习200天,则大概需要10年时间。10年!

原文:http://www.cnblogs.com/luminji/archive/2011/09/08/2169955.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/296583.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《Redis核心技术与实战》学习总结(1)

【Redis】| 总结/Edison Zhou0写在开头作为Key/Value键值数据库&#xff0c;Redis的应用非常广泛。在之前多年的工作生涯中&#xff0c;我也只是关注了零散的技术点&#xff0c;没有对Redis建立起一套整体观&#xff0c;但只有建立了系统整体观&#xff0c;才能更好地定位问题和…

饿了么翻车,美团被质疑,马云也赔了40亿,这项技术为什么让人害怕?

全世界只有3.14 % 的人关注了爆炸吧知识人类还没用力AI可能就倒下了8日&#xff0c;一篇《外卖骑手&#xff0c;困在系统里》的文章刷爆了朋友圈。看过的人多半都不好受&#xff0c;除了作为社畜感叹生活不易外&#xff0c;就是感叹外卖系统的AI算法对人类的裹挟是那么的残酷。…

如何强制 .NET 程序以 管理员模式 运行 ?

咨询区 Gold&#xff1a;我有一个 winform 程序部署客户的PC机上&#xff0c;请问我如何通过编码的形式强制让程序以管理员模式运行&#xff1f;回答区 Gaspa79&#xff1a;如果你用的是 Visual Studio 2019&#xff0c;可以通过工具去配置&#xff0c;右键 项目 -> 新建项 …

bitmap 转byte[]后读取_闲谈redis的bitmap

bitmap的原理bitmap就是通过最小的单位bit(8bit 1b 0.001kb)来进行0或者1的设置&#xff0c;表示某个元素对应的值或者状态。一个bit的值&#xff0c;或者是0&#xff0c;或者是1&#xff1b;也就是说一个bit能存储的最多信息是2。优点基于最小的单位bit进行存储&#xff0c;…

序1--年轻正当时(特权)

序1 年轻正当时 这本所谓的书&#xff0c;恐怕不一定能够带还没入门的U杀进FPGA开发的大门&#xff0c;当然也肯定不能达到进阶的目的。但是&#xff0c;姑且应了Bingo老弟所谓的对“图像的直觉”&#xff0c;确实图文并茂的从某一个山寨面把FPGA开发赤裸裸的展现给了大家。 被…

Windows 11 dapr 环境安装

安装其实很简单按照dapr官网操作步骤其实没什么大问题的,不过在没有好的网络访问github的情况下真是有点揪心啦&#xff01;推荐使用 工具 fastgithub 访问githubFast&#xff1a;Github让Github畅通无阻windows 11 下的安装方式1.安装dapr cli 直接到Releases dapr/cli GitH…

日本原装进口雪平锅,煎炸炒煮全搞定,日本人用了 1000 年

▲ 点击查看小爆我虽然热爱烹饪&#xff0c;但不得不说「下厨房」&#xff0c;也是个坑。光是锅&#xff0c;我就要买好几个。为了蒸包子馒头买蒸锅&#xff0c;为了炒菜买炒锅&#xff0c;偶尔想精致喝热牛奶又买了小奶锅&#xff0c;为了煲汤、做点卤味解解馋&#xff0c;买炖…

Android开发学习笔记:浅谈Content Provider

一.Content Provider的概念介绍 Content Providers是所有应用程序之间数据存储和检索的桥梁&#xff0c;它使得各个应用程序之间实现数据共享。是应用程序间共享数据的唯一途径。Content Provider 主要的功能就是存储并检索数据以及向其他应用程序提供访问数据的接口。其中包括…

VS2010插件之NuGet

Visual Studio&#xff08;简写VS&#xff09;是.net程序员开发必不可少的开发工具&#xff0c;随着VS的版本不断的升级和使用用户的扩大&#xff0c;现在针对VS开发了许多的开源免费的插件&#xff0c;大大的方便了程序员的开发&#xff0c;提高了开发效率。今天&#xff0c;我…

C# WPF Caliburn.Micro框架下利用Mef加载其它项目界面

01—前言MEF是微软自家的托管可扩展框架&#xff0c;在这里我把它用成了ioc容器。在Caliburn.Micro框架下&#xff0c;view和viewmodel被注入到CompositionContainer容器中&#xff0c;然后通过名称可以实现view和viewmodel的匹配。利用这一特点&#xff0c;在多人合作项目开发…

女朋友竟然提出这种奇怪的要求......

1 为什么女朋友会提这么奇怪的要求&#xff1f;▼2 我的数学能力▼3 一看就是老龙人了阁下是古墓派传人吧▼4 如果可爱能晋级的话你已经赢了▼5 要做个与众不同的垃圾▼6 女孩子喜欢帅哥是不分年龄的▼‍‍7 单身狗又做错了什么呢&#xff1f;▼扫描这个二维码你将会有机…

Java编码规范,在您进行编码之前应该阅读的规范

为什么80%的码农都做不了架构师&#xff1f;>>> 本文转载于&#xff1a;http://www.web3d.com.cn/new/teach/java3d/2006/11/13/363276161.html Java编码规范 说明 1.1 为什么要有编码规范 编码规范对于程序员而言尤为重要&#xff0c;有以下几个原因&#xff1a; …

.NET Core 如何调试 CPU 爆高?

在这篇文章中我们将会分析一个 CPU 爆高的案例&#xff0c;测试demo链接 &#xff1a;https://docs.microsoft.com/en-us/samples/dotnet/samples/diagnostic-scenarios/ 。你将会学到&#xff1a;如何使用 dotnet-counters 确定真实的 cpu 使用率。使用 dotnet-trace 追踪代码…

[OIBH] 糖果盒(Candy Box)——又一个最大子矩形

http://codewaysky.sinaapp.com/problem.php?id1056 这题和奶牛浴场略有区别&#xff0c;奶牛浴场只需要求出最大子矩形&#xff0c;而这题要求的是最大权重子矩形&#xff0c;不一定要最大的面积&#xff0c;但要最大的权重和 思路是先求出每个最大子矩形&#xff0c;然后求出…

日本第一赘婿!他入赘近20年拿下诺贝尔奖,成名后不忘教光棍讨老婆......

全世界只有3.14 % 的人关注了爆炸吧知识谁能凭感性要诺贝尔奖私有1949年12月10号&#xff0c;日本民众发出了暌违多年的欢呼声&#xff0c;因为诺贝尔奖史无前例地颁给了一位日本物理学家——汤川秀树。报道汤川秀树获奖新闻的报纸获奖后&#xff0c;在自传《旅人&#xff1a;一…

修改mongodb最大查询数_WebFlux系列(十二)MongoDB应用,新增、修改、查询、删除

#Java#Spring#SpringBoot#Mongo#reactor#webflux#数据库#新增#修改#查询#删除#Spring Boot WebFlux Mongo数据库新增、删除、查询、修改视频讲解 : https://www.bilibili.com/video/av84240038/Employee.javapackage com.example.spring.webfluxmongo;import lombok.AllArgsCon…

为什么每个理发店门口都有彩色的柱子?你不知道吧

全世界只有3.14 % 的人关注了爆炸吧知识为什么街上的理发店门口都有一根旋转着的彩色灯柱&#xff1f;好学的小编忍不住去寻找真相...理发店门口彩色的柱子这根彩柱与医疗有关彩柱通常是3种颜色&#xff0c;白红蓝。一般认为&#xff1a;白色绷带&#xff0c;红色绷带上的血(动…

是否显示展开_Creo7.0教程之绝对精度对钣金件展开的作用详解

在讲Creo7.0绝对精度对钣金展开的帮助之前&#xff0c;我们有必要先来说明一下Creo的精度定义。刚使用Creo7.0版本的新建模型&#xff0c;很多网友就问&#xff0c;怎么模板文件中有两个同样单位的选择&#xff0c;“abs”和“rel”有什么区别&#xff1f;新建文件选项其实这就…

知乎点赞超过10万的科学脱单法!这绝对是我见过最硬核的撩妹套路......

全世界只有3.14 % 的人关注了爆炸吧知识科学脱单硬核撩妹前两天&#xff0c;超模君在知乎上看到一个热门的问答&#xff1a;开学后如何快速找到对象&#xff1f;这个话题&#xff0c;让超模君回想起了当年刚进入大学的那会儿&#xff0c;校园中秀恩爱的情侣无处不在&#xff0c…

office 高效办公智慧树_干货高效实用的office办公小技巧之word篇

对于office三剑客ppt、Word、Excel的使用成了日常&#xff0c;作为办公党&#xff0c;今天就拿出自己在平时工作之中发现、学到的小技巧来做个总结&#xff0c;分享给大家。相信很多大神对于这些小技巧都已经精通&#xff0c;所以lz会先列出目录&#xff0c;大家可以自行依据目…