Cache trang web ASP.NET
Chúng ta biết rằng sử dụng Cache là một trong số những cách làm tăng tốc độ thực thi trang web. Trong ứng dụng ASP.NET có 3 cách để cache dữ liệu: Page Level Caching (called Output Caching) Page Fragment Caching (often called Partial-Page Output Caching) Programmatic or Data Caching ...
Chúng ta biết rằng sử dụng Cache là một trong số những cách làm tăng tốc độ thực thi trang web. Trong ứng dụng ASP.NET có 3 cách để cache dữ liệu:
- Page Level Caching (called Output Caching)
- Page Fragment Caching (often called Partial-Page Output Caching)
- Programmatic or Data Caching
Output Caching Cache ở mức trang, hay còn gọi là cache đầu ra, là cách cache toàn bộ dữ liệu HTML đối với mỗi request. ASP.NET thực hiện điều này thông qua engine Output Cache. Mỗi lần có một request đến, engine này sẽ kiểm tra xem trang kết quả có nằm trong cache hay không. Nếu có, nó sẽ được trả về, ngược lại, trang web sẽ được render lại từ đầu, rồi sau đó được lưu lại trong engine. Output Cache được sử dụng nếu như bạn cần kết xuất ra những trang hầu như tĩnh, ví dụ, các bài báo trong một trang có thể nói là tĩnh. Để sử dụng, đơn giản chúng ta dùng chỉ dẫn sau ở đầu trang:
<%@OutputCache Duration="60" VaryByParam="none" %>
Tham số Duration chỉ ra khoảng thời gian mà Cache sẽ lưu trữ trang đó, tính bằng giây. Khi hết khoảng thời gian nay, cache sẽ hết hiệu quả, và trang sẽ được vẽ lại từ đầu. Tham số VaryByParam chỉ ra những tham số GET (ví dụ, thông qua QueryString) hay POST (ví dụ, thông qua các form) nào sẽ được sử dụng để xác định cache được trả về. Nói cách khác, sẽ có nhiều phiên bản của trang web được lưu trữ, và hệ thống trả về phiên bản nào tùy theo giá trị tham số này. Điều này rất là hữu dụng, trong trường hợp mà hệ thống của bạn sử dụng trả ra các kết quả thay đổi theo tham số đầu vào, ví dụ như /ProductInfo.aspx?ProductID=4 sẽ trả ra thông tin sản phẩm với ProductID=4. Nếu một request khác dạng /ProductInfo.aspx?ProductID=8 thì tất nhiên, sẽ phải trả ra thông tin sản phẩm với ProductID=8. Nếu bạn thiết lập tham số VaryByParam="none", thì engine cache sẽ giả thiết rằng tất cả các trang ProductInfo.aspx có kết quả trả ra như nhau, và hậu quả là hai trang trên trả về cũng một kết quả. Để giải quyết vấn đề, chỉ đơn giản chúng ta thiết lập tham số VaryByParam="ProductID", hoặc chỉ ra là cần xét tất cả các tham số: VaryByParam="*"
Partial-Page Output Caching Có những lúc chúng ta không cache toàn bộ trang, mà chỉ là một phần của trang thôi. Chẳng hạn, danh sách đơn hàng trong công ty là biến đổi theo thời gian, nhưng danh mục hàng có thể là không đổi. Lúc này, chúng ta chỉ cache một phần của trang. Rất đơn giản, bạn cần phải sử dụng phương pháp cache một phần, hay cache một user control: xây dựng các user control mới (*.ascx), thiết lập thuộc tính Cache giống như là cách làm đối với một trang bình thường.
Data Caching Một cách nữa, chúng ta không cache cả trang, hay control (tức là cache dòng HTML trả về client), mà chúng ta chỉ cache dữ liệu thôi. Ví dụ, yêu cầu viết 1 module hiển thị tổng số thành viên trong hệ thống và tổng số lần truy cập. Rõ ràng là tổng số thành viên có thể là không đổi (trong một khoảng thời gian dài), nhưng tổng số lần truy cập thì không. Lúc này, chúng ta cần tính toán tổng số thành viên, đưa vào cache để sử dụng sau này. Để lưu trữ dữ liệu, cú pháp đơn giản như sau:
Cache["foo"] = bar;
Để lấy lại dữ liệu, cú pháp:
bar = Cache["foo"];
Chú ý rằng, sau câu lệnh này, muốn sử dụng dữ liệu, hãy kiểm tra xem nó có null hay không. Lí do, cache được lưu trữ trong bộ nhớ, vì một lí do nào đó mà phần bộ nhớ này bị mất, thì giá trị trả về sẽ là null. Như vậy, đoạn lệnh sẽ phải như sau:
if (Cache["foo"] != null) bar = Cache["foo"]; else bar = MyFunc();
Vì Cache là một collection, nên chúng ta cũng có thể sử dụng hai phương thức là Insert và Add để thêm vào Cache. Cú pháp như sau:
Cache.Insert("foo", bar);
Chú ý rằng, việc sử dụng hàm Insert, chúng ta có thể điều khiển một số tham số khác của Cache, ví dụ thời gian tồn tại của Cache. Câu lệnh sau sẽ chèn một biến vào cache, và biến này sẽ tồn tại 15 phút kể từ lần truy cập cuối
System.Web.HttpContext.Current.Cache.Insert("CacheName", bien, null, DateTime.MaxValue, TimeSpan.FromMinutes(15));
Một ví dụ khác, cache thay đổi tùy theo một file trên đĩa bị thay đổi:
Cache.Insert("foo", bar, new CacheDependancy(Server.MapPath("BarData.xml")));
Với cú pháp trên, cache engine sẽ xóa cache foo nếu như tập tin BarData.xml trên đĩa bị thay đổi. Để cache dữ liệu trong CSDL, tôi hay sử dụng cách sau: truy vấn dữ liệu và trả về một DataSet, sau đó đưa vào Cache. Từ lần sau, sẽ lookup trong Cache trước khi truy vấn. Ví dụ đoạn lệnh như sau:
DataSet ds = System.Web.HttpContext.Current.Cache["CacheName"] as DataSet; if (ds == null) { ds = CategoryDB.GetLastestNews(CategoryID, NoOfNews, LanguageCode); System.Web.HttpContext.Current.Cache.Insert("CacheName", ds, null, DateTime.MaxValue, TimeSpan.FromMinutes(15)); }
Cache trong SQL ASP.NET hỗ trợ Cache rất tốt cả ở mặt Server và Client sau đây mình sẽ Show 1 đoạn thiết lập Cache cho Database SQL Server 2000 ;