Giới thiệu
Caching là một trong những phương pháp hiệu quả nhất để cải thiện hiệu suất và khả năng mở rộng của API. Bằng cách lưu trữ dữ liệu được yêu cầu thường xuyên, bạn có thể giảm tải cho cơ sở dữ liệu, tăng tốc độ phản hồi và xử lý lưu lượng truy cập cao hơn mà không làm giảm hiệu suất.
Trong bài viết này, chúng ta sẽ khám phá caching bộ nhớ, caching phản hồi và caching phân tán trong .NET Core Web API với các ví dụ thực tiễn.
Mục lục
1. Caching phản hồi
Caching phản hồi cho phép các phản hồi từ API của bạn được lưu trữ và sử dụng lại trong một khoảng thời gian xác định.
Cài đặt trong Program.cs
csharp
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Services.AddResponseCaching();
var app = builder.Build();
app.UseResponseCaching();
app.MapControllers();
app.Run();
Sử dụng caching phản hồi trong Controller
csharp
[ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
[HttpGet]
[ResponseCache(Duration = 60, Location = ResponseCacheLocation.Client)]
public IActionResult Get()
{
var products = new[] { "Sản phẩm 1", "Sản phẩm 2" };
return Ok(products);
}
}
✅ Phản hồi API sẽ được cached trong 60 giây trên client.
2. Caching bộ nhớ
Caching bộ nhớ lưu trữ dữ liệu trong bộ nhớ của server.
Cài đặt trong Program.cs
csharp
builder.Services.AddMemoryCache();
Sử dụng caching bộ nhớ trong Controller
csharp
[ApiController]
[Route("api/[controller]")]
public class OrdersController : ControllerBase
{
private readonly IMemoryCache _cache;
public OrdersController(IMemoryCache cache)
{
_cache = cache;
}
[HttpGet]
public IActionResult GetOrders()
{
const string cacheKey = "orders_list";
if (!_cache.TryGetValue(cacheKey, out string[] orders))
{
// Giả lập việc lấy từ cơ sở dữ liệu
orders = new[] { "Đơn hàng 1", "Đơn hàng 2" };
var cacheOptions = new MemoryCacheEntryOptions
{
AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(5),
SlidingExpiration = TimeSpan.FromMinutes(2)
};
_cache.Set(cacheKey, orders, cacheOptions);
}
return Ok(orders);
}
}
✅ Giảm thiểu các cuộc gọi đến cơ sở dữ liệu cho dữ liệu được truy cập thường xuyên.
3. Caching phân tán
Caching phân tán lưu trữ cache bên ngoài ứng dụng, phù hợp cho môi trường đa server.
Cài đặt với Redis
bash
dotnet add package Microsoft.Extensions.Caching.StackExchangeRedis
csharp
builder.Services.AddStackExchangeRedisCache(options =>
{
options.Configuration = "localhost:6379";
options.InstanceName = "MyApp_";
});
Sử dụng caching phân tán trong Controller
csharp
[ApiController]
[Route("api/[controller]")]
public class CustomersController : ControllerBase
{
private readonly IDistributedCache _cache;
public CustomersController(IDistributedCache cache)
{
_cache = cache;
}
[HttpGet]
public async Task<IActionResult> GetCustomers()
{
var cacheKey = "customers_list";
var cachedData = await _cache.GetStringAsync(cacheKey);
if (string.IsNullOrEmpty(cachedData))
{
var customers = new[] { "Khách hàng 1", "Khách hàng 2" };
cachedData = System.Text.Json.JsonSerializer.Serialize(customers);
var options = new DistributedCacheEntryOptions
{
AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(10)
};
await _cache.SetStringAsync(cacheKey, cachedData, options);
}
var result = System.Text.Json.JsonSerializer.Deserialize<string[]>(cachedData);
return Ok(result);
}
}
✅ Hoạt động trên nhiều instance của API trong môi trường cân bằng tải.
Tổng kết
Caching là điều cần thiết để cải thiện hiệu suất, khả năng mở rộng và trải nghiệm người dùng của API. Trong .NET Core Web API, bạn có một số tùy chọn:
- Caching phản hồi: Để caching đơn giản, phía client của các phản hồi.
- Caching bộ nhớ: Caching nhanh trong một instance server duy nhất.
- Caching phân tán: Caching có thể mở rộng trên nhiều server (ví dụ: Redis).
Bằng cách triển khai caching một cách hợp lý, bạn có thể giảm tải cơ sở dữ liệu và cải thiện thời gian phản hồi cho người dùng của mình.
Câu hỏi thường gặp
1. Caching là gì?
Caching là quá trình lưu trữ dữ liệu tạm thời để truy cập nhanh hơn và giảm tải cho hệ thống.
2. Tôi nên sử dụng loại caching nào?
Điều này phụ thuộc vào nhu cầu của ứng dụng của bạn. Nếu chỉ cần caching đơn giản, bạn có thể sử dụng caching phản hồi. Nếu cần hiệu suất tốt hơn trong môi trường phức tạp, hãy xem xét caching phân tán.
3. Caching có ảnh hưởng đến bảo mật không?
Có, bạn cần cẩn thận với dữ liệu nhạy cảm. Đảm bảo không lưu trữ thông tin nhạy cảm trong cache hoặc thiết lập các biện pháp bảo mật phù hợp.