Caching là một kĩ thuật phổ biến dùng để tăng sự thực thi bằng cách thường xuyên lưu lại các dữ liệu đã được truy cập hoặc dữ liệu lớn trong bộ nhớ. Trong khuôn khổ các ứng dụng Web thì caching dùng để giữ lại các trang hoặc dữ liệu qua những yêu cầu của HTTP và sử dụng lại chúng mà không cần phải tạo lại lần nữa. ASP.Net có Một số các kiểu caching có thể sử dụng cho các ứng dụng web gồm : output caching, fragment caching, data caching.
Outpug caching: Khi dùng Output caching toàn bộ nội dung của trang sẽ được lưu lại. Với những trang có lượng truy cập lớn, Caching sẽ thường xuyên lưu lại (đến )từng phút một. Khi một trang được lưu lại bằng Output cache, Những yêu cầu gửi tới trang đó sẽ được thực hiện ở trang output mà không cần phải thi hành code hay tạo lại nữa.
Fragment caching: Đôi khi lưu lại toàn bộ trang là không cần thiết, có thể chỉ một phần của trang phải được tạo ra hoặc đáp ứng một yêu cầu nào đó của người sử dụng. Khi đó, Bạn cần phải xác định những đối tượng và dữ liệu nào cần thiết để tạo dựng và đáng để lưu lại. Mỗi khi nhận ra các phần tử đó thì chúng có thể được tạo ra một lần và sẽ được lưu lại trong một khoảng thời gian nào đó. Ngoài ra, Fragment caching còn có thể được sử dụng để lưu lại một phần của trang output.
Data caching: Bạn làm thế nào để lựa chọn thời điểm lưu lại một phần từ trên trang? Với một vài phần tử, dữ liệu có thể bị thay đổi một cách đều đặn hoặc dữ liệu chỉ có giá trị tại một thời điểm hiện tại. Khi đó một “chính sách” với các phần tử được lưu sẽ được đưa ra trước khi chúng mất đi. Code để truy cập tới các phần tử được lưu chỉ đơn giản là kiểm tra xem nó có hay chưa và tạo lại nó nếu cần thiết.
Cache của ASP.net cung cấp các tệp và từ khóa tạo sự phụ thuộc, cho phép bạn tạo phần tử cache phụ thuộc vào một file bên ngoài hoặc phụ thuộc vào một phần tử cache khác. Kĩ thuật này có thể được sử dụng để xóa bỏ các phần tử nằm trong những dữ liệu thay đổi.
Ở phần 1 của bài viết tôi sẽ giới thiệu với các bạn về Output cache và Fragment cache.
Output cache
Chúng ta sử dụng output caching cho toàn bộ trang mà không thay đổi thường xuyên. Output caching sẽ lưu lại toàn bộ dữ liệu HTML của trang web. Mỗi lần có một request đến, nó sẽ kiểm tra xem đã có trong cache hay chưa nếu có thì nó sẽ được trả về còn chưa thì nó sẽ được lưu lại trong Output caching. Để sử dụng trước tiên bạn hãy nhớ đặt chỉ thị @OutputCache ngay đầu trang .aspx.
<%@ OutputCache Duration="600" VaryByParam="None" %>
Các 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 này, cache sẽ hết hiệu quả, và trang sẽ được vẽ lại từ đầu.Trong khai báo trên thì trang sẽ được cache lại sau 10 phút. Tất cả nội dung đều được lưu lại kể cả hàm thời gian <%= now() %>
VaryByParam: chỉ ra tham số GET -thông qua QueryString ,tham số POST - 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. Bạn có thể nhận được kết quả cache khác nhau khi thay đổi giá trị của tham số đầu vào.
ví dụ :
/Student.aspx?StudentID=1 sẽ trả ra thông tin sản phẩm StudentID =1. Nếu một request khác dạng /Student.aspx?StudentID=2, thì tất nhiên, sẽ phải trả ra thông tin sản phẩm với StudentID=2. 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 Student.aspx có kết quả trả ra như nhau, và 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="StudentID", hoặc chỉ ra là cần xét tất cả các tham số: VaryByParam="*".
Ngoài ra bạn chỉ dẫn @OutputCache còn có thêm 2 thuộc tính nữa là VaryByHeader và VaryByCustom.
VaryByHeader: thuộc tính này giúp bạn thay đổi cache theo HTTP headers hiện tại. Nó thực sữ hữu ích khi bạn muốn cache những trang thay đổi về ngôn ngữ và các tác nhân của người dùng.
VaryByCustom.: có thể quyết định output cache phụ thuộc vào các thiết lập khác nhau như là phiên bản của các trình duyệt.
Nếu bạn muốn dùng full page caching nhưng có một số chức năng trên đó bạn không sử dụng được, bạn có thể sử dụng lớp HttpCachePolicy. Bạn chỉ việc làm theo mẫu sau:
Response.Cache.[option] : trong đó option là các miêu tả bạn muốn.
Ví dụ: Response.Cache.SetExpires( DateTime.Now.AddSeconds( 600 ) )
Khi đó cứ sau 10 phút (600s): trang đó sẽ được cache lại một lần giống như ví dụ tôi đã trình bày ở trên.
Bạn cũng có thể sử dụng thuộc tính “cacheability” để xác định cách thức lưu trang. Bạn có các lựa chọn sau:
NoCache: Toàn bộ trang hoặc một vài phần của trang sẽ không được cache mà phải có yêu cầu.
Server: Trang được cache ở Web Server
Public: Trang được cached ở máy client và được public, như là một proxy server
Private: Trang chỉ được cache ở trên máy client. Thuộc tính này là mặc định
Fragment 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. Đó là fragments caching, 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.
Một điều lưu ý đó là fragment caching không có các thuộc tính VaryByHeader hoặc VaryByCustom. Nó có các thuộc tính VaryByParam làm việc giống như output caching, ngoài ra chúng ta cũng sử dụng các thuộc tính khác như là VaryByControl. Thuộc tính này cho phép ta thay đổi nhiều thành phần cache cơ bản là giá trị của các server controls chứa trong đó, như là select box hay check boxes.
Đây chỉ là những mẫu cơ bản nhất của caching được cung cấp trong ASP. Net. Nó không hoàn toàn phù hợp trong tất cả các trường hợp nhưng khi sử dụng nó bạn sẽ nhận được rất nhiều lợi ích trong việc thực thi một ứng dụng Web.