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

壓縮網頁載入時間:Web頁面并行化的幾點考慮

原創
開發 前端
縮短網頁載入時間是建立網站時所必須要考慮的問題。為進一步縮短網頁載入時間,將數據庫訪問并行是一個十分有效的方法。本文介紹Web頁面并行化中需要考慮的幾個問題,以及Java的實現方式。

【51CTO精選譯文】建立網站時,最常見的需求是將網頁載入時間最小化,例如,一般對主要頁面的載入時間要求控制在0.5秒以內,當然網頁載入時間是與許多因素關聯的,如網絡,緩存,Web服務器,腳本語言/代碼,數據庫訪問等。當然我想要討論在創建Web頁面時對數據庫的訪問,我指的是動態Web頁面,如使用PHP,Java/J2EE,Ruby和Asp(.NET)等創建的動態Web頁面。

一個非常常見的編程風格是使用腳本段,如:

  1. < html> 
  2. < body> 
  3.     Time now is < %= new java.util.Date() %> 
  4. < /body> 
  5. < /html> 

使用當前時間的文本代替上面的“< %= new java.util.Date() %>”。

如果我制作了一個動態內容站點,比如使用Wordpress建立一個博客站點,需要生成多個動態內容,如最新的帖子,熱門標簽,帖子評論等,同樣也會生成對數據庫的訪問,主要是查詢數據庫,我想這里不用再多說什么,大家都能理解了。

問題

在生成一些“重量級”的網頁時,如在線報紙和書店,可能會涉及到多個查詢,如你是否已經登錄?我們是否有建議推給你?最新的主題是什么?你以前的興趣是什么?你有朋友在線嗎?你在網站上會產生什么內容?

我最近審查一個網站,每個頁面產生的查詢次數都大于500,我個人認為這是一個非常高的數目了,但這些查詢確實都是需要的,問題是網頁載入時間花了2秒。

經過調整,重寫和使用索引后,頁面載入時間下降到0.6秒,但這還不夠快,問題是所有數據庫訪問都是串行的,它們需要并行起來。Web頁面并行化的需求由此誕生。

MySQL為一個查詢計算只能使用一個線程,但I/O卻是支持多線程的,這就導致在標準的Linux發行版上,對于一個給定的Web頁面,只有一個CPU可以使用。模板引擎是一個接一個地解析腳本段的,按順序執行的,在Java中,一個JSP頁面被重寫為一個普通的Java Servlet類,腳本段成為主要的代碼,HTML代碼成為打印標準的輸出,因此獲得是線性執行代碼。

即便是再先進的框架,其標準的方法還是線性的,例如,使用Spring框架,你有Java對象和控制器負責Web頁面,可以避免在動態Web頁面中使用腳本,只需要那些控制器提供的數據,因此如果使用Spring + Velocity,一個Web頁面看起來就會是:

  1. < html> 
  2. < body> 
  3.     Login time as recorded in DB is: ${user.loginTime}  
  4. < /body> 
  5. < /html> 

在預建user對象時調用getLoginTime()方法進行轉換,但這個方法是如何工作的呢?

它會緩慢地初始化以便訪問數據庫得到答案嗎?

在某些init()方法期間控制器會設置值嗎?

控制器會設置值以響應Web頁面的請求參數,并逐一解析它們嗎?

上面的一切都是線性或是串行執行的。

壓縮網頁載入時間:如何并行?

Web頁面并行化不是一件容易的事情,需要理解多線程編程,程序員需要了解競爭環境、死鎖和資源缺乏問題等,不過這些在動態網頁中一般不會成問題,有些編程語言對多線程編程提供了良好的支持,Java就是這樣一門語言。

假設我需要產生一個10個查詢來響應Web頁面的請求,如使用Java,我們可以像下面這樣編寫代碼:

  1. CountDownLatch doneSignal = new CountDownLatch(10);  
  2.  
  3. Runnable task1 = new Runnable() {  
  4.     public void run()  
  5.     {  
  6.         user.setLoginTime(this.jdbcTemplate.queryForInt("SELECT ... FROM ..."));  
  7.         doneSignal.countDown();  
  8.     }  
  9. } ;  
  10.  
  11. Runnable task2 = new Runnable() {  
  12.     public void run()  
  13.     {  
  14.         headlines = getSimpleJdbcTemplate().query("SELECT * FROM headline WHERE...",  
  15.             new ParameterizedRowMapper< Headline>() {  
  16.                 public Headline mapRow(ResultSet rs, int rowNum)  
  17.                 {  
  18.                     Headline headline = new Headline();  
  19.                     headline.setTitle(rs.getString("title");  
  20.                     headline.setUrl(rs.getString("url");  
  21.                     ...  
  22.                 }  
  23.             }  
  24.         doneSignal.countDown();  
  25.     }  
  26. } ;  
  27.  
  28. ...  
  29.  
  30. Runnable task10 = new Runnable() {  
  31.     ...  
  32.     doneSignal.countDown();  
  33. }  
  34. Executor executor = Executors.newFixedThreadPool(numberOfAvailableProcessors);  
  35. executor.execute(task1);  
  36. ...  
  37. executor.execute(task10);  
  38.  
  39. doneSignal.await();  
  40.  
  41. // Now fill in the Model  

上面的代碼其實相對較簡單,可讀性也比較好,它的意思是:

◆讓我們創建10個任務,但不執行它們,僅僅是制定命令;

◆每項任務完成后,讓CountDownLatch知道它已經完成(但記住我們還沒有執行它);

◆我們創建或使用一個線程池,使用n個線程,n可以與我們的處理器數量進行關聯;

◆我們要求線程池處理所有的線程,在處理過程中,要么是同時運行它們,要么有些是順序執行,依賴于有多少線程可使用;

◆我們請求CountDownLatch進行阻塞,直到這10個任務都通知已經完成了;

接著執行下一批任務。

Spring有一個內置的TaskExecutor機制提供與上面說的線程池類似的解決方案。

我大多數時候都是使用的C/C++/Java,我不知道在PHP,Ruby,ASP.NET或其它語言該如何實現,上面的代碼肯定不能拿去直接使用,我希望看到框架能夠提供解決這個問題的方案,以便對于一般的Web開發都可以用上Web頁面并行技術。

原文:The DB problem inherent to dynamic web pages

作者:Shlomi Noach

【推薦閱讀】

  1. Web性能之戰打響 開發者面臨復雜度挑戰
  2. Google專家:JavaScript是網站性能的致命克星
  3. Google面向開發者推出網頁加速工具Page Speed
  4. 緩存設計詳解:低成本的高性能Web應用解決方案
  5. 高性能Web應用的六個好習慣
責任編輯:yangsai 來源: 51CTO.com
相關推薦

2009-10-10 10:44:15

ASP.NET頁面緩存

2010-04-26 10:31:13

Aix系統安全

2018-10-29 09:24:41

Web圖片壓縮網頁加速

2009-04-20 15:20:36

JSON網站布局實際模塊

2017-09-19 14:28:06

Web開發網站

2021-06-07 15:01:18

銀行數字化轉型數據安全

2009-08-13 09:01:00

ASP.NET開發Web標準

2013-02-26 14:07:52

SQL Server虛擬化

2018-10-18 09:34:16

高并發異步化并行化

2023-10-07 10:42:44

微軟微軟商店應用

2012-03-07 17:00:22

響應式Web

2018-09-04 10:57:50

MySQLMariaDB數據庫

2018-06-05 11:28:30

同有科技

2015-09-18 10:57:45

Web網頁性

2010-04-27 11:42:24

虛擬化

2011-04-27 10:57:29

高性能web開發

2021-10-08 10:26:07

文件存儲數據存儲存儲

2011-05-18 09:44:39

虛擬化服務器安全

2024-06-04 14:20:47

數字化轉型數字化

2021-06-02 11:10:09

PythonWeb可視化
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 九九在线视频 | 狠狠干在线 | 精品视频在线免费观看 | 久久久久久国产一区二区三区 | 欧美日韩电影免费观看 | 天天躁日日躁性色aⅴ电影 免费在线观看成年人视频 国产欧美精品 | 最新国产精品精品视频 | 国产欧美在线一区 | 日本成人在线播放 | 黄色欧美| 黄色片免费在线观看 | 在线观看国产 | 欧美日韩中文字幕在线播放 | 亚洲视频一 | 日韩在线视频一区 | 久久亚洲一区二区三区四区 | 国产成人免费 | 91电影在线播放 | 久久久国产一区二区三区四区小说 | 久久九九99 | 日韩av成人在线 | 国产精品久久久久久久久图文区 | 国产成人免费在线观看 | 成年视频在线观看 | 人人玩人人干 | 亚洲综合国产 | 久久久久久久99 | 亚洲视频在线看 | 视频在线亚洲 | 黄网免费看 | 久久一区二区av | 91久久国产 | 成人av免费 | 国产一区二区免费电影 | 日韩久久综合网 | 亚洲三区在线播放 | 国产视频一区二区在线观看 | 欧美日韩一区二区三区四区五区 | 99re6在线 | 91国内精精品久久久久久婷婷 | 日韩视频在线播放 |