
Giới thiệu
Khi bạn xây dựng một ứng dụng ASP.NET Core, một trong những thách thức lớn nhất là hiệu năng. Khi ứng dụng của bạn phát triển và có nhiều người dùng bắt đầu sử dụng nó hơn, cơ sở dữ liệu của bạn sẽ bị tấn công nhiều lần vì cùng một dữ liệu. Điều này làm chậm ứng dụng của bạn và tăng tải máy chủ.
Đây chính là lúc bộ nhớ đệm phân tán của Redis phát huy tác dụng.
Thay vì gọi cơ sở dữ liệu mọi lúc, bạn lưu trữ dữ liệu được sử dụng thường xuyên trong hệ thống trong bộ nhớ nhanh như Redis. Lần tiếp theo ai đó yêu cầu dữ liệu tương tự, dữ liệu đó sẽ được trả về ngay lập tức từ bộ đệm thay vì cơ sở dữ liệu.
Trong hướng dẫn này, bạn sẽ tìm hiểu từng bước cách sử dụng bộ nhớ đệm phân tán Redis trong ASP.NET Core một cách đơn giản và thực tế.
Bộ nhớ đệm phân tán là gì?
Bộ nhớ đệm phân tán có nghĩa là lưu trữ dữ liệu được lưu trong bộ nhớ đệm bên ngoài ứng dụng của bạn, thường là trong một dịch vụ riêng biệt như Redis.
Trong bộ đệm (trong bộ nhớ) thông thường, dữ liệu được lưu trữ bên trong một máy chủ. Nếu ứng dụng của bạn chạy trên nhiều máy chủ thì mỗi máy chủ sẽ có bộ đệm riêng, điều này có thể gây ra sự không nhất quán.
Nhưng trong bộ nhớ đệm phân tán:
-
Tất cả các máy chủ đều dùng chung bộ đệm
-
Dữ liệu vẫn nhất quán trên toàn bộ ứng dụng
-
Nó hoạt động tốt trong môi trường có thể mở rộng
Nói một cách đơn giản, bộ đệm phân tán giống như bộ nhớ dùng chung mà tất cả máy chủ ứng dụng của bạn có thể sử dụng.
Redis là gì?
Redis là một kho lưu trữ dữ liệu trong bộ nhớ rất nhanh, được sử dụng rộng rãi để lưu vào bộ nhớ đệm.
Hãy coi Redis như một từ điển siêu nhanh trong đó:
-
Bạn lưu trữ dữ liệu bằng khóa
-
Bạn truy xuất dữ liệu bằng cùng một khóa
Tại sao các nhà phát triển thích Redis:
-
Nó cực kỳ nhanh vì nó lưu trữ dữ liệu trong bộ nhớ
-
Nó hỗ trợ lưu trữ khóa-giá trị đơn giản
-
Dễ dàng tích hợp với ASP.NET Core
-
Nó hoạt động hiệu quả cho các ứng dụng dựa trên đám mây và có thể mở rộng
Điều kiện tiên quyết
Trước khi bắt đầu, hãy đảm bảo bạn đã chuẩn bị sẵn những thứ sau:
-
.NET SDK được cài đặt trên hệ thống của bạn
-
Một dự án ASP.NET Core đang hoạt động
-
Redis được cài đặt cục bộ hoặc truy cập vào dịch vụ Redis trên đám mây
-
Hiểu biết cơ bản về bộ điều khiển và dịch vụ trong ASP.NET Core
Nếu Redis không được cài đặt cục bộ, bạn có thể sử dụng Docker hoặc bất kỳ nhà cung cấp đám mây nào.
Bước 1:Cài đặt gói NuGet bắt buộc
Trước tiên, bạn cần cài đặt gói bộ nhớ đệm Redis.
Chạy lệnh sau:
dotnet add package Microsoft.Extensions.Caching.StackExchangeRedis
Gói này kết nối ứng dụng ASP.NET Core của bạn với Redis và cho phép hỗ trợ bộ nhớ đệm phân tán.
Bước 2:Định cấu hình Redis trong ASP.NET Core
Tiếp theo, bạn cần cho ứng dụng của mình biết cách kết nối với Redis.
Mở Program.cs của bạn tập tin và thêm cấu hình sau:
builder.Services.AddStackExchangeRedisCache(options =>
{
options.Configuration = "localhost:6379";
options.InstanceName = "SampleApp_";
});
Giải thích bằng thuật ngữ đơn giản:
-
localhost:6379→ Đây là địa chỉ Redis đang chạy -
InstanceName→ Tiền tố được thêm vào tất cả các khóa bộ đệm (giúp sắp xếp dữ liệu)
Nếu bạn đang sử dụng Cloud Redis, hãy thay thế giá trị localhost bằng chuỗi kết nối của bạn.
Bước 3:Đưa dịch vụ IDistributedCache vào
ASP.NET Core cung cấp giao diện tích hợp có tên IDistributedCache để làm việc với Redis.
Bạn cần đưa nó vào dịch vụ hoặc bộ điều khiển của mình.
public class ProductService
{
private readonly IDistributedCache _cache;
public ProductService(IDistributedCache cache)
{
_cache = cache;
}
}
Nói một cách đơn giản, điều này cho phép lớp của bạn nói chuyện với Redis.
Bước 4:Lưu trữ dữ liệu trong Redis Cache
Để lưu trữ dữ liệu trong Redis, bạn sử dụng SetStringAsync phương pháp.
public async Task SetCacheDataAsync(string key, string value)
{
var options = new DistributedCacheEntryOptions
{
AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(10)
};
await _cache.SetStringAsync(key, value, options);
}
Chuyện gì đang xảy ra ở đây:
-
Bạn đang lưu dữ liệu bằng một khóa duy nhất
-
Bạn đang đặt thời gian hết hạn (10 phút)
Tại sao thời hạn hết hạn lại quan trọng:
-
Ngăn chặn dữ liệu lỗi thời
-
Giữ bộ nhớ đệm sạch
-
Tiết kiệm bộ nhớ
Bước 5:Truy xuất dữ liệu từ bộ đệm
Để lấy dữ liệu từ Redis, bạn sử dụng:
public async Task<string> GetCacheDataAsync(string key)
{
return await _cache.GetStringAsync(key);
}
Nếu dữ liệu tồn tại, nó sẽ trả về ngay lập tức.
Nếu không, nó sẽ trả về null.
Việc này nhanh hơn nhiều so với việc gọi cơ sở dữ liệu.
Bước 6:Triển khai mẫu dành riêng cho bộ đệm
Cách phổ biến nhất để sử dụng bộ nhớ đệm là mẫu Cache-Aside.
Điều này có nghĩa là:
-
Đầu tiên hãy kiểm tra bộ đệm
-
Nếu dữ liệu tồn tại → trả lại
-
Nếu không → tìm nạp từ cơ sở dữ liệu và lưu vào bộ đệm
Ví dụ:
public async Task<string> GetProductAsync(string productId)
{
string cacheKey = $"product_{productId}";
var cachedData = await _cache.GetStringAsync(cacheKey);
if (!string.IsNullOrEmpty(cachedData))
{
return cachedData;
}
var productData = "Product from Database";
await _cache.SetStringAsync(cacheKey, productData, new DistributedCacheEntryOptions
{
AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(5)
});
return productData;
}
Cách tiếp cận này:
-
Giảm các cuộc gọi cơ sở dữ liệu
-
Cải thiện thời gian phản hồi
-
Tự động lấp đầy bộ đệm khi cần
Bước 7:Làm việc với các đối tượng phức tạp
Redis lưu trữ dữ liệu dưới dạng chuỗi nên đối với các đối tượng, bạn cần chuyển đổi chúng thành JSON.
public async Task SetObjectAsync<T>(string key, T data)
{
var jsonData = JsonSerializer.Serialize(data);
await _cache.SetStringAsync(key, jsonData);
}
public async Task<T> GetObjectAsync<T>(string key)
{
var jsonData = await _cache.GetStringAsync(key);
return jsonData == null ? default : JsonSerializer.Deserialize<T>(jsonData);
}
Nói một cách đơn giản:
-
Chuyển đổi đối tượng → JSON → lưu trữ trong Redis
-
Truy xuất JSON → chuyển đổi về đối tượng
Bước 8:Xóa dữ liệu khỏi bộ đệm
Đôi khi bạn cần xóa dữ liệu bộ đệm đã lỗi thời hoặc không chính xác.
await _cache.RemoveAsync("product_1");
Điều này hữu ích khi:
-
Dữ liệu được cập nhật vào cơ sở dữ liệu
-
Bộ đệm trở nên không hợp lệ
Bước 9:Các phương pháp hay nhất cho bộ nhớ đệm Redis
Để sử dụng Redis hiệu quả, hãy làm theo các phương pháp đơn giản sau:
-
Sử dụng các khóa bộ đệm rõ ràng và duy nhất
-
Luôn đặt thời gian hết hạn
-
Không lưu trữ dữ liệu nhạy cảm
-
Tránh lưu trữ những đồ vật có kích thước rất lớn
-
Giám sát việc sử dụng và hiệu suất bộ đệm
Những phương pháp này giúp duy trì hiệu suất và tránh các vấn đề sau này.
Bước 10:Các trường hợp sử dụng phổ biến
Bộ nhớ đệm Redis thường được sử dụng cho:
-
Bộ nhớ đệm phản hồi API
-
Danh sách sản phẩm
-
Phiên của người dùng
-
Dữ liệu được truy cập thường xuyên
-
Dữ liệu trên trang tổng quan
Nếu dữ liệu được đọc thường xuyên nhưng thay đổi ít thường xuyên hơn thì đó là ứng cử viên phù hợp để lưu vào bộ nhớ đệm.
Ưu điểm của việc sử dụng Redis trong ASP.NET Core
Sử dụng Redis mang lại một số lợi ích:
-
Hiệu suất ứng dụng nhanh hơn
-
Giảm tải cơ sở dữ liệu
-
Khả năng mở rộng tốt hơn
-
Cải thiện trải nghiệm người dùng
Nó đặc biệt hữu ích trong các ứng dụng có lưu lượng truy cập cao.
Tóm tắt
Bộ nhớ đệm phân tán với Redis trong ASP.NET Core là một cách đơn giản nhưng mạnh mẽ để cải thiện hiệu suất ứng dụng. Thay vì liên tục gọi cơ sở dữ liệu, bạn lưu trữ dữ liệu được sử dụng thường xuyên trong Redis và truy xuất dữ liệu đó một cách nhanh chóng khi cần. Bằng cách làm theo cách tiếp cận từng bước, sử dụng các mẫu như Cache-Aside và áp dụng các phương pháp hay nhất, bạn có thể xây dựng các ứng dụng nhanh, có thể mở rộng và hiệu quả. Hãy bắt đầu từ quy mô nhỏ, triển khai bộ nhớ đệm ở những nơi quan trọng nhất và dần dần tối ưu hóa hệ thống của bạn để có hiệu suất tốt hơn.