Cache ASP.NET

Bạn cần sử dụng caching, nhưng bạn không thể lưu giữ toàn bộ một trang vì nó chứa một số mã cần phải chạy hoặc một số nội dung cần phải được tạo động. Hãy sSử dụng phương thức Cache.Insert để lưu giữ bất kỳ đối tượng nào với chính sách hết hiệu lực trượt (sliding expiration) hoặc hết hiệu lực tuyệt đối (absolute expiration).

Đối tượng Cache cho phép bạn lưu giữ hầu như bất kỳ đối tượng .NET nào bằng một khóa chuỗi cùng với chính sách hết hiệu lực do bạn định nghĩa. ASP.NET duy trì cache một cách tự động, gỡ bỏ các đối tượng khi chúng hết hiệu lực hoặc khi cạn bộ nhớ.

Có hai kiểu chính sách hết hiệu lực bạn có thể sử dụng khi lưu giữ dữ liệu trong cache. Hết hiệu lực tuyệt đối (absolute expiration) làm mất hiệu lực các item đã được lưu giữ sau một khoảng thời gian cố định, gần giống với output-caching. Hết hiệu lực tuyệt đối là cách tiếp cận tốt nhất nếu bạn muốn lưu giữ các thông tin cần được làm tươi định kỳ (như danh mục sản phầm).
// Lưu giữ ObjectToCache trong 10 phút (với khóa là "Catalog").
// TimeSpan.Zero cho biết "không sử dụng sliding expiration".
Cache.Insert("Catalog", ObjectToCache, null, DateTime.Now.AddMinutes(10), TimeSpan.Zero);

Hết hiệu lực trượt (sliding expiration) gỡ bỏ các đối tượng sau một khoảng thời gian không dùng đến. Trong trường hợp này, mỗi khi đối tượng được truy xuất, thời gian sống của nó sẽ được reset. Hết hiệu lực trượt làm việc tốt khi bạn có các thông tin luôn có hiệu lực nhưng luôn không được sử dụng (như dữ liệu thuộc về quá khứ). Thông tin này không cần được làm tươi, nhưng không nên giữ nó trong cache nếu nó không được sử dụng.
// Lưu giữ ObjectToCache nếu nó được sử dụng ít nhất
// một lần mỗi 10 phút (với khóa là "Catalog").
// DateTime.MaxValue cho biết "không sử dụng absolute expiration".
Cache.Insert("Catalog", ObjectToCache, null,DateTime.MaxValue, TimeSpan.FromMinutes(10));

Bạn có thể lấy các item từ cache bằng tên khóa. Tuy nhiên, bạn phải luôn kiểm tra trước xem item có tồn tại hay không và rồi ép nó thành kiểu như mong muốn.

Khi thêm các đối tượng vào cache, cách tốt nhất là tạo một hàm độc lập có thể tái tạo đối tượng khi cần. Ví dụ, nếu đang lưu giữ một DataSet, bạn cần tạo một hàm kiểm tra cache và chỉ truy vấn lại cơ sở dữ liệu khi không tìm thấy DataSet. Điều này cho phép bạn tránh đi phần xử lý tốn nhiều thời gian nhất – truy vấn cơ sở dữ liệu – trong khi vẫn cho phép mã lệnh của bạn thay đổi hiển thị (chẳng hạn, người dùng yêu cầu sắp thứ tự) hoặc thực hiện các hành động khác.

Ví dụ dưới đây sẽ hiển thị một bảng chứa thông tin về khách hàng được lấy từ một DataSet. Phần then chốt là lớp CustomerDatabase, đóng gói các chức năng cần thiết để đổ dữ liệu vào DataSet và quản lý cache. Vì lớp này không thừa kế từ Page nên nó cần sử dụng thuộc tính tĩnh HttpContext.Current để lấy tham chiếu đến đối tượng Cache.
using System;
using System.Data;
using System.Web;
using System.Configuration;
using System.Diagnostics;
using System.Web.Caching;
using System.Data.SqlClient;

public class CustomerDatabase
{
private string connectionString;
// Lấy tham chiếu đến đối tượng Cache.
private Cache cache = HttpContext.Current.Cache;
public CustomerDatabase()
{
// Lấy chuỗi kết nối từ file Web.config.
connectionString = ConfigurationSettings.AppSettings["NorthwindCon"];
}
public DataSet GetCustomers()
{
DataSet customersDS;
// Kiểm tra item có nằm trong cache hay không.
if (cache["Customers"] == null)
{
// Lấy DataSet từ cơ sở dữ liệu.
customersDS = GetCustomersFromDatabase();
// Lưu giữ item trong cache
// cùng với sliding expiration là 60 giây.
cache.Insert("Customers", customersDS, null, DateTime.MaxValue, TimeSpan.FromSeconds(60));
// Hiển thị thông điệp trong cửa sổ Debug.
Debug.WriteLine("DataSet created from data source.");
}
else
{
// Hiển thị thông điệp trong cửa sổ Debug.
Debug.WriteLine("DataSet retrieved from cache.");
// Lấy item.
customersDS = (DataSet)cache["Customers"];
}
// Trả về DataSet.
return customersDS;
}
private DataSet GetCustomersFromDatabase()
{
// Tạo DataSet.
DataSet customersDS = new DataSet();
// Đổ dữ liệu vào DataSet.
SqlConnection con = new SqlConnection(connectionString);
SqlCommand cmd = new SqlCommand("SELECT * FROM Customers", con);
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
try
{
con.Open();
adapter.Fill(customersDS, "Customers");
}
catch
{
customersDS = null;
}
finally
{
con.Close();
}
}
}

Bước kế tiếp là tạo một trang web sử dụng lớp CustomerDatabase. Trang web dưới đây gồm một DataGrid và một Button. Mỗi khi người dùng nhắp vào Button, trang sẽ gọi phương thức CustomerDatabase.GetCustomers. Thông tin được lấy từ cache nếu vẫn còn hiệu lực hoặc được truy vấn lại nếu 60 giây đã trôi qua. Bạn có thể nhận biết DataSet có được lấy từ cache hay không bằng cách nhìn vào kết xuất trong cửa sổ Debug.
using System;
using System.Web;
using System.Web.UI.WebControls;
public class LoginPage : System.Web.UI.Page
{
protected System.Web.UI.WebControls.DataGrid DataGrid1;
protected System.Web.UI.WebControls.Button cmdGetData;
// (Bỏ qua phần mã designer.)
private void cmdGetData_Click(object sender, System.EventArgs e)
{
CustomerDatabase custDB = new CustomerDatabase();
DataGrid1.DataSource = custDB.GetCustomers();
DataGrid1.DataBind();
}
}

Về tieuyeuit
Lập trình viên Asp.net Tôi chia sẻ một,bạn chia sẻ một và chúng ta có rất nhiều!

Gửi phản hồi

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s

%d bloggers like this: