一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - ASP.NET教程 - ASP.NET性能優化之構建自定義文件緩存

ASP.NET性能優化之構建自定義文件緩存

2019-09-18 11:17ASP.NET空間網 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,代碼如下:

復制代碼代碼如下:


public class FileCacheProvider : OutputCacheProvider 

private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 
public override void Initialize(string name, NameValueCollection attributes) 

base.Initialize(name, attributes); 
CachePath = HttpContext.Current.Server.MapPath(attributes["cachePath"]); 

public override object Add(string key, object entry, DateTime utcExpiry) 

Object obj = Get(key); 
if (obj != null) //這一步很重要 

return obj; 

Set(key,entry,utcExpiry); 
return entry; 

public override object Get(string key) 

string path = ConvertKeyToPath(key); 
if (!File.Exists(path)) 

return null; 

CacheItem item = null; 
using (FileStream file = File.OpenRead(path)) 

var formatter = new BinaryFormatter(); 
item = (CacheItem)formatter.Deserialize(file); 

if (item.ExpiryDate <= DateTime.Now.ToUniversalTime()) 

log.Info(item.ExpiryDate + "*" + key); 
Remove(key); 
return null; 

return item.Item; 

public override void Set(string key, object entry, DateTime utcExpiry) 

CacheItem item = new CacheItem(entry, utcExpiry); 
string path = ConvertKeyToPath(key); 
using (FileStream file = File.OpenWrite(path)) 

BinaryFormatter formatter = new BinaryFormatter(); 
formatter.Serialize(file, item); 


public override void Remove(string key) 

string path = ConvertKeyToPath(key); 
if (File.Exists(path)) 
File.Delete(path); 

public string CachePath 

get; 
set; 

private string ConvertKeyToPath(string key) 

string file = key.Replace('/', '-'); 
file += ".txt"; 
return Path.Combine(CachePath, file); 


[Serializable] 
public class CacheItem 

public DateTime ExpiryDate; 
public object Item; 
public CacheItem(object entry, DateTime utcExpiry) 

Item = entry; 
ExpiryDate = utcExpiry; 


有兩個地方需要特別說明: 
在Add方法中,有一個條件判斷,必須做出這樣的處理,否則緩存機制將會緩存第一次的結果,過了有效期后緩存講失效并不再重建; 
在示例程序中,我們簡單的將緩存放到了Cache目錄下,在實際的項目實踐中,考慮到緩存的頁面將是成千上萬的,所以我們必須要做目錄分級,否則尋找并讀取緩存文件將會成為效率瓶頸,這會耗盡CPU。 
3:配置文件 
我們需要在Web.config中配置緩存處理程序是自定義的FileCacheProvider,即在 <system.web>下添加節點: 

復制代碼代碼如下:


<caching> 
<outputCache defaultProvider="FileCache"> 
<providers> 
<add name="FileCache" type="MvcApplication2.Common.FileCacheProvider" cachePath="~/Cache" /> 
</providers> 
</outputCache> 
</caching> 


4:緩存的使用 
我們假設在MVC的控制中使用(如果要在ASP.NET頁面中使用,則在頁面中包含<%@OutputCache VaryByParam="none" Duration="10" %>),可以看到,Index是未進行輸出緩存的,而Index2進行了輸出緩存,緩存時間為10秒。 

復制代碼代碼如下:


public class HomeController : Controller 

private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 
static string s_conn = "Data Source=192.168.0.77;Initial Catalog=luminjidb;User Id=sa;Password=sa;"; 
public ActionResult Index() 

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()")) 

ViewBag.Message = ds.Tables[0].Rows[0]["name"].ToString(); 

return View(); 

[OutputCache(Duration = 10, VaryByParam = "none")] 
public ActionResult Index2() 

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()")) 

ViewBag.Message = ds.Tables[0].Rows[0]["name"].ToString(); 

return View(); 

 

 

5:查看下效果

上面的代碼,在訪問了Index2后,將會在Cache文件夾下產生緩存文件,如下:

ASP.NET性能優化之構建自定義文件緩存

現在,我們開始評價下有輸出緩存和無輸出緩存的性能對比,模擬100個用戶并發1000次請求如下:

ASP.NET性能優化之構建自定義文件緩存

可以看到,有輸出緩存后,吞吐率明顯提高了10倍。

6:代碼下載

FileCacheProvider的原始代碼來自于網絡,我修改了其中的BUG,全部代碼下載如下:MvcApplication20110907.rar

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久免费看少妇高潮A片JA | 久久久精品免费免费直播 | 亚洲欧美日韩在线观看看另类 | 成年男女免费视频观看性 | 日本h乱淫动漫在线观看 | 欧美日韩在线一区二区三区 | 国产精品 视频一区 二区三区 | 性插图动态图无遮挡 | 国产一区二区三区欧美 | 无人区大片免费播放器 | 欧美一区二区福利视频 | 国产一区二区精品 | 毛片免费视频观看 | 国产精品免费观在线 | 操bb| 果冻传媒新在线观看免费 | 日韩天堂视频 | 日本黄色大片免费观看 | free service性v极品 | 青草欧美 | 青青草伊人久久 | 免费大片a一级一级 | 国产一级黄色录像 | 国产短视频精品一区二区三区 | 欧美洲大黑香蕉在线视频 | 亲爱的客栈第二季免费观看完整版 | 亚洲欧美日韩国产一区图片 | 被强迫调教的高辣小说 | 天美视频在线 | 滑进了柔佳火热紧夹的 | 娇妻被老外疯狂调教 | 美女靠逼动漫 | 美女毛片在线 | 久久永久影院免费 | 日韩一级精品视频在线观看 | 成年极品漫画在线观看 | 暖暖在线精品日本中文 | 日本最新免费二区 | 紧身裙女教师波多野结衣 | gay中国 | 日本三级做a全过程在线观看 |