Skip to content

HybridCache trong ASP.NET Core .NET 10

Tôi đã từng phải viết các phương thức mở rộng (extension methods) tùy chỉnh cho IDistributedCache – như GetOrSetAsync, TryGetValue, SetAsync với generic – cho mọi dự án cần dùng đến Redis caching. Hàng tá dòng code khuôn mẫu (boilerplate...

00:00 / --:--

Read by your browser's built-in voice.

Tôi đã từng phải viết các phương thức mở rộng (extension methods) tùy chỉnh cho IDistributedCache – như GetOrSetAsync, TryGetValue, SetAsync với generic – cho mọi dự án cần dùng đến Redis caching. Hàng tá dòng code khuôn mẫu (boilerplate) lặp đi lặp lại được tôi copy từ dự án này sang dự án khác. HybridCache đã khiến toàn bộ những đoạn code đó trở nên lỗi thời chỉ với một lệnh gọi GetOrCreateAsync duy nhất.

Nhưng đó thậm chí chưa phải là phần tuyệt vời nhất. Điều tuyệt vời nhất là khả năng chống bão cache (stampede protection). Tôi đã chạy thử 100 request đồng thời vào một bộ nhớ cache rỗng (cold cache). Với IMemoryCache, 100 truy vấn cơ sở dữ liệu đã bị kích hoạt. Nhưng với HybridCache, con số này chính xác là 1.

Trong bài viết này, tôi sẽ hướng dẫn bạn mọi thứ về HybridCache trong ASP.NET Core với .NET 10 - từ kiến trúc L1/L2 đến toàn bộ bề mặt API, việc vô hiệu hóa cache theo thẻ (tag-based invalidation), sử dụng Redis làm backend L2, so sánh việc chuyển đổi từ IDistributedCache, các chỉ số đo lường từ BenchmarkDotNet, và demo về khả năng chống stampede kèm theo log chứng minh. Tôi cũng sẽ chia sẻ quan điểm của mình về việc khi nào thì HybridCache là sự lựa chọn phù hợp và khi nào bạn nên giữ nguyên giải pháp hiện tại.

Cùng bắt đầu thôi.

Tóm tắt nhanh (TL;DR): HybridCache là phương pháp caching được khuyến nghị cho các dự án .NET 10 mới. Nó kết hợp tốc độ trong bộ nhớ của L1 (phản hồi siêu tốc 0.05 micro giây) với khả năng lưu trữ bền bỉ của L2 Redis (tùy chọn), tích hợp sẵn tính năng bảo vệ stampede (100 request đồng thời = 1 truy vấn database), và vô hiệu hóa theo thẻ thông qua RemoveByTagAsync. Cài đặt chỉ với 2 bước đơn giản: cài đặt package Microsoft.Extensions.Caching.Hybrid và gọi AddHybridCache() trong file Program.cs. Đây là một bước tiến vượt bậc có thể thay thế hoàn hảo cho cả IMemoryCache và IDistributedCache.

HybridCache trong ASP.NET Core là gì?

HybridCache là một thư viện .NET (phiên bản GA từ .NET 9, ổn định trong .NET 10) cung cấp một API caching hợp nhất kết hợp giữa caching trong bộ nhớ (L1) với caching phân tán (L2 - tùy chọn), tích hợp bảo vệ stampede, và vô hiệu hóa theo tag thông qua một phương thức GetOrCreateAsync duy nhất. Nó được phát hành trong gói NuGet Microsoft.Extensions.Caching.Hybrid và là phương pháp caching được Microsoft khuyên dùng cho các dự án ASP.NET Core mới.

Dưới đây là cách kiến trúc L1/L2 hoạt động:

L1 (In-Memory - Trong bộ nhớ): Mỗi phiên bản (instance) của ứng dụng duy trì một bộ nhớ cache nội bộ của riêng nó, giống hệt như IMemoryCache. Tốc độ phản hồi (cache hits) ở tầng này được tính bằng nano giây vì hoàn toàn không cần serialize (tuần tự hóa) dữ liệu.

L2 (Distributed - Phân tán): Một cache ngoại vi tùy chọn (như Redis, SQL Server, hoặc bất kỳ implementation nào của IDistributedCache). Khi không tìm thấy dữ liệu ở L1 (L1 miss), HybridCache sẽ kiểm tra L2 trước khi truy vấn thẳng vào database. Dữ liệu ở tầng này sẽ được tuần tự hóa và chia sẻ giữa tất cả các instance.

Thực thi Factory: Nếu cả L1 và L2 đều không có dữ liệu, HybridCache sẽ thực thi factory delegate (thực hiện truy vấn cơ sở dữ liệu của bạn), lưu kết quả vào cả L1 và L2, rồi trả về dữ liệu đó. Điều cốt lõi là: chỉ có một request đồng thời duy nhất được phép thực thi factory cho một key. Tất cả các request đang chờ khác sẽ nhận chung kết quả trả về từ request đầu tiên.

Theo thông báo chính thức trên blog của .NET, thư viện này được mô tả như một "sự thay thế trực tiếp cho IDistributedCache và IMemoryCache". Điều này gần như chính xác, mặc dù sẽ có một vài khác biệt nhỏ về sắc thái khi đào sâu hơn.

(Lưu ý: Nội dung trên đây là phần cốt lõi và giới thiệu quan trọng nhất được trích xuất từ link trang web. Phần còn lại của bài viết chứa các đoạn code demo chuyên sâu hoặc đã bị giới hạn hiển thị trên nền tảng blog).

Rate this article

Rate this article out of 5

No ratings yet
Be the first to rate this article.

Selecting a star will ask you to sign in.
HV
Huy Vũ
Contributor at Selectgo

Shares practical engineering notes on this blog.