實作快取有兩種方式:儘可能使用 Internet 架構來達成快取, 或是撰寫程式以協助 Internet
架構來進行快取。撰寫快取演算法雖然相當有趣, 不過卻很可能徒勞無功。這是因為在 HTTP 要求鏈中,
有許多元素皆會快取資料。如果再自行設計快取功能, 可能會在不同階段重覆快取相同的資料, 對於整體效能並無幫助。
HTML 與 HTTP 快取指令
藉由 Internet 架構來管理快取機制, 亦可稱為使用「HTTP 逾期」(HTTP Expiration) 模型。有兩種方式可藉由
Internet 架構來控制快取:新增 HTML 標記, 或是新增 HTTP ID。
以下範例使用 HTML 標記來控制快取:
<html>
<head>
<title>Hanging Page</title>
<meta http-equiv="Cache-Control" content="max-age=3600">
<meta http-equiv="Expires" content="Tue, 01 Jan 1980 1:00:00 GMT">
</head>
<body>
... |
HTML meta 標記具有兩個可模仿 HTTP ID 的屬性:http-equiv 與 content。使用 HTML meta
標記的問題在於, 這些標記是供 Web 瀏覽器之用, 因此無法在 XML 資料流中加入 meta 標記。亦即, 此種依賴 HTML 的快取機制,
不適用於非 HTML 的資料。
使用 Internet 架構來控制快取的第二種方式, 便是產生一組 HTTP 標記, 如下列 HTTP 要求結果所示:
HTTP/1.1 200 OK
Cache-Control: Public, max-age=3600
Expires: Wed, 10 Aug 2005 10:35:37 GMT
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 39
Date: Wed, 10 Aug 2005 09:35:37 GMT
Server: Apache-Coyote/1.1
<html><body>Hello world</body></html> |
Cache-Control 與 Expires 等兩個 HTTP ID 負責管理快取網頁的方式。Cache-Control
指定將內容存放在快取中 3600 秒 (1 小時)。Expires 定義擷取的內容何時逾期。Cache-Control 與 Expires
皆可讓 Proxy 或瀏覽器以「HTTP 逾期」模型來快取 HTTP 內容。
若是在 script 中使用, 可藉由下列 ASP.NET 程式碼來產生 HTTP ID:
<%@ Page Language = "C#" %>
<%@ Import Namespace="System" %>
<%
Response.Cache.SetExpires(DateTime.Now.AddMinutes( 60 ) ) ;
Response.Cache.SetCacheability(HttpCacheability.Public) ;
%>
<html>
<head>
<title>Cached Page</title>
</head>
<body>
Hello world!
</body>
</html> |
在 .NET 中, SetExpires 與 SetCacheability 方法會新增 Expires 與 Cache-Control
ID。若要使用 Java Servlet 來達成相同效果, 請參考下列程式碼:
import javax.servlet.http.*;
import javax.servlet.*;
import java.io.*;
import java.util.*;
public class GenerateHeader extends HttpServlet {
protected void doGet(HttpServletRequest req,
HttpServletResponse resp)
throws ServletException, IOException {
resp.addHeader("Cache-Control", "Public, max-age=3600");
resp.addHeader("Expires",
"Fri, 30 Oct 2006 14:19:41 GMT");
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
out.println("<html><body>Hello world</body></html>");
}
} |
|