成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

高性能ASP.NET站點構(gòu)建之細節(jié)決定成敗

開發(fā) 后端
本文將為大家介紹的是ASP.NET站點構(gòu)建之優(yōu)化HTTP請求,通過優(yōu)化HTTP請求可以大大加快頁面的載入速度,提高頁面體驗。

高性能ASP.NET站點構(gòu)建系列文章目錄

  1. 高性能ASP.NET站點構(gòu)建之開篇
  2. 高性能ASP.NET站點構(gòu)建之剖析頁面的處理過程
  3. 高性能ASP.NET站點構(gòu)建之優(yōu)化HTTP請求
  4. 高性能ASP.NET站點構(gòu)建之細節(jié)決定成敗
  5. 高性能ASP.NET站點構(gòu)建之性能調(diào)優(yōu)綜述
  6. 高性能ASP.NET站點構(gòu)建之識別性能瓶頸
  7. 高性能ASP.NET站點構(gòu)建之簡單的優(yōu)化措施
  8. ASP.NET站點構(gòu)建之減少不必要的請求
  9. 高性能ASP.NET站點構(gòu)建之托管資源優(yōu)化
  10. 高性能ASP.NET站點構(gòu)建之監(jiān)測CLR性能

前言:曾經(jīng)就因為一個小小的疏忽,從而導(dǎo)致了服務(wù)器崩潰了,后來才發(fā)現(xiàn):原來就是因為一個循環(huán)而導(dǎo)致的,所以,對“注意細節(jié)“這一說法是深有感觸。

本篇的議題如下:

問題的描述

細節(jié)的重要性

問題的描述

首先,描述一下故事的背景:(希望大家耐心的故事讀完)

在網(wǎng)站中,網(wǎng)頁中的分頁控件每次顯示10條數(shù)據(jù),每次點擊下一頁,就再次去取下一個10條數(shù)據(jù)。至于分頁的方法怎樣做,方法有很多,相信這點大家都知道。

過程是這樣的:在用戶請求數(shù)據(jù)的時候(考慮到了用戶的操作和網(wǎng)站的訪問量)我會第一次取出500條數(shù)據(jù),然后把數(shù)據(jù)放在緩存中,也就是說,我取出了50頁的數(shù)據(jù),放在緩存中,這樣如果,以后用戶請求第一頁到第49頁的時候,就直接從緩存中拿數(shù)據(jù)。

如下圖:

緩存流程圖
 

第一個數(shù)據(jù)塊:

采用鍵值對的形式:字典保存

如果用戶請求到了49頁以后,那么就再次從數(shù)據(jù)庫中取出下一個數(shù)據(jù)塊(包含501到1000數(shù)據(jù)),然后,現(xiàn)在內(nèi)存中就有了1000條數(shù)據(jù)。

至于緩存多久,數(shù)據(jù)什么失效,失效后怎么做,這里暫不談?wù)摗#ňW(wǎng)站在這種緩存策略下運行的很好)。 

代碼如下:

  1. List<Product> products=GetDataFromCacheOrDatabase(condition,pageIndex,count….); 

 

代碼的意思很清楚,從緩存中拿數(shù)據(jù),如果緩存中沒有對應(yīng)的數(shù)據(jù),那么就先從數(shù)據(jù)庫中拿500條數(shù)據(jù),然后放在緩存中,最后返回10條數(shù)據(jù)。

后來,因為某些功能的需要,需要返回當(dāng)前頁的前6頁數(shù)據(jù)和后6頁的數(shù)據(jù),例如:如果當(dāng)前頁是第12頁,那么就要返回12頁之前6頁Product(也就是第6,7,8,9,10,11頁的數(shù)據(jù)),和第12頁后的頁的Product(第13,14,15,16,17,18頁的數(shù)據(jù))。 

如下:

 

 

當(dāng)然,如果當(dāng)前頁是第5頁,那么就把之前所有5頁的數(shù)據(jù)都返回,另外再加上第5頁之后的6頁數(shù)據(jù)。

這里就可能涉及到跨塊獲取數(shù)據(jù),如:

如果當(dāng)前頁是第48頁的時候,那么返回前6頁數(shù)據(jù)是沒有什么問題的,那么后6頁的數(shù)據(jù)就不足了,因為49,40也得數(shù)據(jù)可以從緩存的數(shù)據(jù)塊中取到,至于51,52,53,54頁的數(shù)據(jù),就需要再次從數(shù)據(jù)庫中讀取,然后再次緩存(如果事先沒有被緩存)。

最后在緩存中的數(shù)據(jù)如下:

然后調(diào)用方法:(偽碼)

  1. List<Product> products=GetDataFromCacheOrDatabase(condition,42, 126….);  

上面?zhèn)魅氲氖菑牡?2頁開始的數(shù)據(jù),也就是第48頁的前6頁和后6頁的數(shù)據(jù)。

這個方法的內(nèi)部實現(xiàn)是這樣的:

1.    首先從第一個數(shù)據(jù)塊中取出42頁到50頁的數(shù)據(jù)

取出數(shù)據(jù)后保存在一個List<Product> firstProductList;

2.    從第二個數(shù)據(jù)塊中取出從51頁到54頁(如果第二個數(shù)據(jù)塊在緩存不存在,就去數(shù)據(jù)庫中取501-1000條,然后再放在緩存的第二個數(shù)據(jù)塊中)。

保存在第二個List<Product> secondProductList

3. 然后把兩個list合并,返回結(jié)果。例如

  1. secondProductList.Foreach(u=>firstProductList.Add(u)); 

基本的實現(xiàn)就是這樣,看起來還行,也比較的合理,但是就是因為這個操作,從而導(dǎo)致服務(wù)器內(nèi)存溢出。

大家想想看是什么原因。

細節(jié)的重要性

其實緩存的數(shù)據(jù)不是很多,是不足以讓服務(wù)器內(nèi)存溢出的,但是服務(wù)器還是出現(xiàn)了out of memory的異常。之前一直跑的很好,就是改了代碼之后才出現(xiàn)問題的。

其實這就是由于一個最基本的錯誤產(chǎn)生的:引用類型。

下面就來分析下:

首先是從第一個數(shù)據(jù)塊中取出數(shù)據(jù),然后用

List<Product> firstProductList 引用指向取出的數(shù)據(jù)

然后從第二個數(shù)據(jù)塊中取出數(shù)據(jù),用

List<Product> secondProductList指向數(shù)據(jù)的引用

如下圖

 

在第三步中采用

  1. secondProductList.Foreach(u=>firstProductList.Add(u)); 

 

把secondProductList中的數(shù)據(jù)加入到firstProductList中,就因為是引用類型,其實實際操作的結(jié)果是:不斷的在改變第一個數(shù)據(jù)塊中的數(shù)據(jù),使得第一個數(shù)據(jù)塊中的數(shù)據(jù)逐漸的變多。

現(xiàn)在當(dāng)前頁是48頁,采用上面的操作,致使第一個數(shù)據(jù)塊中的數(shù)據(jù)增加了60條,

如果用戶再次翻頁,到了49頁,那么第一個數(shù)據(jù)塊中的數(shù)據(jù)又增多了60條

依此類推,最后導(dǎo)致了服務(wù)器內(nèi)存的不足,致使服務(wù)器崩潰了。原本的“功臣”----緩存卻成為了罪魁禍首。

其實這個問題的解決,只要改變一點點的代碼就行了: 

  1. List<Product> firstProductList;  
  2. List<Product> secondProductList; 

然后

List<Product> resultProductList=new List<Product>();然后分別把firstProductList,secondProductList遍歷,加入到resultProductList就行了。

就這么簡單。

一個小的細節(jié),導(dǎo)致了大的問題。 

原文鏈接:http://www.cnblogs.com/yanyangtian/archive/2010/08/17/1801129.html

【編輯推薦】

  1. 高性能ASP.NET站點構(gòu)建之開篇
  2. 高性能ASP.NET站點構(gòu)建之剖析頁面的處理過程
  3. 高性能ASP.NET站點構(gòu)建之優(yōu)化HTTP請求
  4. 強化部署ASP.Net 2.0配置應(yīng)用程序
  5. 微軟PDC2009直擊:改進ASP.NET 4運行時
  6. 詳解ASP.NET MVC 2自定義驗證
責(zé)任編輯:彭凡 來源: 博客園
相關(guān)推薦

2011-02-13 09:17:02

ASP.NET

2011-02-23 09:49:40

ASP.NET

2011-02-16 09:08:27

ASP.NET

2011-02-15 09:31:56

ASP.NET

2011-02-13 09:37:55

ASP.NET

2011-02-22 09:16:24

高性能ASP.NET

2011-06-15 16:22:38

2011-02-17 09:13:57

ASP.NET

2011-03-11 10:43:52

數(shù)據(jù)遷移

2017-05-11 22:58:59

2020-04-20 11:52:37

Static變量靜態(tài)

2010-07-22 09:13:00

ASP.NET

2010-05-25 13:22:43

2016-07-05 10:27:30

云計算

2011-04-13 13:49:50

ASP.NET網(wǎng)站優(yōu)化

2011-03-02 09:09:53

MySQL分區(qū)管理細節(jié)

2015-09-30 10:36:03

eSpace UC客戶華為

2010-09-27 14:30:05

評測SSL VPN

2014-10-13 13:40:07

程序員

2011-06-10 13:57:00

SEO
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 一区二区三区欧美大片 | 你懂的国产 | 久久久精品 | 91大神在线资源观看无广告 | 午夜综合 | 国产精品久久一区二区三区 | 999www视频免费观看 | 国产精品乱码一区二区三区 | 国产乱码高清区二区三区在线 | 亚洲精品一区二三区不卡 | japan25hdxxxx日本 做a的各种视频 | 青青久久 | 精品粉嫩超白一线天av | 羞羞视频在线观看网站 | 国产精品美女一区二区 | www.毛片| 夜夜爽99久久国产综合精品女不卡 | 精品亚洲一区二区三区四区五区高 | 亚洲综合激情 | 久久精品欧美一区二区三区不卡 | 日韩在线观看中文字幕 | av一级一片| 玖玖免费 | www日韩欧美| 国产精品视频一区二区三区不卡 | 久草在线视频中文 | 国产视频二区在线观看 | 久久国产精品一区二区三区 | 国产91在线播放精品91 | 精品一二区 | 国产二区视频 | 久久久久久影院 | 日韩欧美国产不卡 | 精品三级在线观看 | 不卡一区二区在线观看 | 色屁屁在线观看 | 国产精品久久久久久久久免费樱桃 | 日韩精品视频一区二区三区 | 久久久久国产精品午夜一区 | 天天综合成人网 | 在线观看国产视频 |