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.
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.
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:
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.
Phần 2: Data Caching
Ở phần trước tôi đã giới thiệu với bạn 2 loại cache trong ASP.Net là Output caching và Fragment caching. Cả 2 phương pháp này đều giúp bạn tăng tốc độ xử lý trên ứng dụng web của mình. Tôi cũng đã trình bày những trường hợp phù hợp nhất để sử dụng 2 loại cache này. Tuy nhiên ASP còn cung cấp một kiểu cache khác rất hữu dụng mà bạn nên sử dụng trong nhiều trường hợp đó là Data cahing. Một cách đơn giản nhất, bạn có thể hiểu data cahing là một kĩ thuật được cung cấp để lưu trữ và truy cập các phần tử trong bộ nhớ. Điều đó có nghĩa là mỗi một đối tượng độc lập (Hầu hết các đối tượng của .NET) sẽ được cache và chia sẻ trong tất cả các Request và Session. Bài này tôi xin giới thiệu với bạn 3 phương thức được dùng trong data caching.
Phương thức Cache:
Đây là cách đơn giản nhất để bạn có thể lấy được một đối tượng hay dữ liệu vào cache. Nếu bạn đã quen thuộc với ASP, bạn sẽ thấy điều này rất đơn giản cũng giống như khi bạn sử dụng biến session.
Đây là cách bạn lưu dữ liệu vào cache:
cache(“item”) = strVal;
Trong đó:
strVal là một giá trị biến bạn sẽ lưu nó vào cache.
Để trả lại giá trị cho biến hay lấy lại dữ liệu:
Rất đơn giản để lưu và lấy lại dữ liệu từ cache nhưng bạn hãy luôn nhớ rằng data cache không chỉ làm việc được với các dữ liệu đơn giản kiểu chuỗi như ví dụ trên mà nó có thể làm việc với tất cả các loại dữ liệu ví dụ như kiểu mảng cũng có thể được lưu lại bằng cách này.
Phương thức .Insert & .Add
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(“item”, strVal);
hoặc
Cú pháp của 2 phương thức này hoàn toàn giống nhau. Có một điều khác đó là hàm add có thêm một lựa chọn, có thể trả về một đối tượng đã có trong dữ liệu cache. Bạn có thể chọn một trong 2 phương thức này tùy thuộc vào yêu cầu của bạn.
Hãy xem lại bạn đã học được những gì từ bài viết này. Đầu tiên bạn được đưa ra 3 loại cache để lựa chọn ( output cache, fragment cache và data cache). Tiếp đến, khi bạn sử dụng data cache bạn được cung cấp thêm những hàm để thi hành. Bạn được chọn lựa giữa hàm insert và hàm add. Cuối cùng tôi sẽ hướng dẫn các bạn làm sao để quy định thời gian kết thúc.
Đầu tiên là một ví dụ để thiết lập một thời gian kết thúc. Bạn có thể làm như sau:
cache.insert(“item”, strVal, nothing, datetime.now.addminutes(10), timespan.zero) ‘there should be no carriage return here
datetime.now.addminutes(10): đối tượng sẽ “chết” sau 10 phút.
Timespan: dùng để thay đổi thời gian kết thúc.
Chúng ta hãy xét ví dụ tiếp theo. ví dụ này xét thời gian hủy đối tượng đến thời điểm sau request cuối cùng của object đó.
cache.insert(“item”, strVal, nothing, datetime.maxvalue,
timespan.fromseconds(60))
Thuộc tính datetime.maxvalue vô hiệu hóa sự kết thúc đối tượng.
Có một lựa chọn rất thú vị. Chúng ta có thể làm cho ứng dụng bỏ đi một đối tượng trong cache, phụ thuộc vào sự thay đổi của các đối tượng khác. Khi một đối tượng mà nó phụ thuộc bị xoad đi thì nó cũng không còn được lưu trong cache nữa. Nó có thể là một file, một hoặc là nhiều đối tượng nào đó được lưu.
Hãy đọc ví dụ sau:
cache.insert(“item”, strVal, New CacheDependency(Server.MapPath(“depend.xml”)))
Cache cũng có những nhược điểm đó là nó làm tốn bộ nhớ. Khi bạn lưu trữ lại quá nhiều cũng dẫn tới những bất cập trong việc quản lý dữ liệu. Micosoft đã tính đến trường hợp này và cung câp cho chúng ta những thuộc tính để thiết lập sự ưu tiên.
Các thuộc tính:
* Not Removable- không bao giờ thu dọn dẹp ở bộ nhớ thấp.
* High- dọn dẹp nhứng phần tử cuối cùng
* Normal- mặc định
* BelowNormal – more likely purged
* Low – first purged
Trước khi đưa ra ví dụ, tôi muốn bạn biết rằng chúng ta có 2 lựa chọn bạn phải có khi thiết lập các thuộc tính của cachel. Đầu tiên là CacheItemPriorityDecay sẽ thiết lập các thuộc tính cho các đối tượng mà được truy cập không thường xuyên. Thứ 2 là CacheItemRemoveCallback sẽ được thiết lập khi ứng dụng muốn dọn dẹp các phần tử cache. Các thuộc tính là: DependencyChanged, Expired, Removed, or Underused.
cache.insert(“item”, strVal, nothing, datetime.maxvalue, _
timespan.fromseconds(60), CacheItemPriority.BelowNormal, _
CacheItemPriorityDecay.Fast, OnRemove)
Pros and Cons of Data Caching
Như vậy với những trang quá động (dữ liệu được thay đổi nhiều theo thời gian), Data caching đã cung cấp những cải tiến mềm dẻo và thực thi cho bạn. Nếu ứng dụng của bạn có một lượng truy cập lớn trên nhiều trang web, bạn có thể lưu nó vào cache sau đó phân phát đến từng trang một đó là ưu điểm lớn nhất. Bạn có thể load chúng vào cache lần đầu tiên được requested và sau đó sẽ phân bổ nó đi từ bộ nhớ. Điều này rất tuyệt cho tập hợp các dữ liệu được lấy từ cơ sở dữ liệu ví dụ như là một employee list hay là từ một site có cấu trúc điều hướng mà bạn không muốn cứ phải truy cập đến database ở từng trang một.