Cách triển khai Memory Cache đơn giản cho Web API
Trong ASP.NET MVC Controller các bạn cũng là làm quen với Output Caching mà mình giới thiệu trong các khóa học ASP.NET MVC. Đó là một trong những cách triển khai caching đơn giản nhất cho ứng dụng ASP.NET MVC sử dụng thư viện sẵn có của nó.
Caching chính là việc giảm thiểu việc lấy dữ liệu liên tục từ nguồn khác đối với các dữ liệu hay truy cập và ít thay đổi. Các bạn nhớ là phải đảm bảo 2 tiêu chí là mức độ truy cập thường xuyên và dữ liệu ít thay đổi. Ví dụ: Danh mục sản phẩm, quyền người dùng, sản phẩm xem nhiều…Điều này làm tăng tốc độ tải trang do dữ liệu được cache sẵn trên bộ nhớ và tiết kiệm thời gian.
Thường trng ASP.NET Web API bạn sẽ cần phải cache một số thứ tạp thời trên bộ nhớ để tăng hiệu năng của chương trình.
Có một vài thư viện hữu ích giúp bạn làm điều đó. Một trong số đó rất phổ biến là CacheCow bạn có thể xem hướng dẫn tại đây. Nhưng nếu bạn muốn sử dụng caching mà không muốn dùng một thư viện của bên thứ 3 nào cả vậy thì làm sao để triển khai nhanh nhất.
Caching cho Web API không sử dụng third party
Tôi đã triển khai một vài lần việc chứng thực người dùng sử dụng ASP.NET Web API với token và muốn cache các token tạm thời trên bộ nhớ để tránh lúc nào cũng phải vào cơ sở dữ liệu để truy xuất ra cho mỗi một request gửi lên.
Cách làm rất đơn giản. Bạn chỉ cần sử dụng một Class được xây dựng sẵn gọi là MemoryCache nằm trong thư viện System.Runtime.Caching dll.
Trước khi sử dụng được class MemoryCache bạn cần Add Reference đến thư viện này:
Tôi đã tạo một class tiện ích cho việc caching:
public class MemoryCacheHelper
{
/// <summary>
/// Get cache value by key
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public static object GetValue(string key)
{
return MemoryCache.Default.Get(key);
}
/// <summary>
/// Add a cache object with date expiration
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <param name="absExpiration"></param>
/// <returns></returns>
public static bool Add(string key, object value, DateTimeOffset absExpiration)
{
return MemoryCache.Default.Add(key, value, absExpiration);
}
/// <summary>
/// Delete cache value from key
/// </summary>
/// <param name="key"></param>
public static void Delete(string key)
{
MemoryCache memoryCache = MemoryCache.Default;
if (memoryCache.Contains(key))
{
memoryCache.Remove(key);
}
}
}
Và khi bạn muốn caching thứ gì đó, chỉ cần add nó vào cache với một cái key duy nhất và giá trị của cache:
MemoryCacheHelper.Add("topProducts",new List<string>() { "A"}, DateTimeOffset.UtcNow.AddHours(1));
Và khi sử dụng chỉ cần get ra theo key đó:
var topProducts = MemoryCacheHelper.GetValue("topProducts");
Chú ý: Bạn nên nhớ là MemoryCache sẽ được xóa mỗi khi IIS app pool được làm mới (recycle)
Nếu Web API của bạn :
- Không nhận được bất cứ request nào trong vòng hơn 20 phút
- Hoặc đặt thời gian mặc định cho IIS làm mới Pool là 1740 phút
- Hoặc bạn deploy một bản build mới lên thư mục Web API được triển khai trên IIS
Thì bạn nên có một thao tác tay. Nếu bạn không lấy giá trị từ cache được thì bạn nên lấy nó từ database và sau đó gán lại vào cache:
var topProducts = MemoryCacheHelper.GetValue("topProducts");
if (topProducts == null)
{
// for example get token from database and put grabbed token
// again in memCacher Cache
MemoryCacheHelper.Add("topProducts", new List<string>() { "A" }, DateTimeOffset.UtcNow.AddHours(1)));
}
Trích nguồn từ: blog.developers.ba
Bài viết liên quan
Nâng cấp RAG thành Agentic RAG với Dynamic Toolcall | Xây dựng RAG AI
Vậy làm thế nào để nâng cấp RAG thành một hệ thống Agentic RAG thông minh hơn, có khả năng tự động quyết định khi nào và nên gọi tool nào? Câu trả lời chính là Dynamic Toolcall.
Đọc thêm
Tối ưu kết quả trả về từ VectorDB với Scoring và Fingerprint | Xây dựng RAG AI
Đến Phần 3 này, chúng ta sẽ cùng nâng cấp khả năng tìm kiếm và truy vấn dữ liệu từ VectorDB.
Đọc thêmTrang bị Memory cho RAG bằng Vector Database với Qdrant
Ở phần tiếp theo này, chúng ta sẽ tiến thêm một bước quan trọng: trang bị bộ nhớ (Memory) cho RAG bằng cách sử dụng Vector Database Qdrant.
Đọc thêm
Hướng dẫn tạo ứng dụng ASP.NET Core (.NET 8) và chuẩn bị kết nối OpenAI Chat Model để xây dựng RAG AI
Trong bài viết này, chúng ta sẽ bắt đầu một hành trình nhỏ: xây dựng một ứng dụng RAG AI (Retrieval-Augmented Generation).
Đọc thêm
Ra mắt khóa học: TEDU-53: Xây dựng ứng dụng CMS với ASP.NET Core 8.0 + Angular.
Ngay bây giờ các bạn có thể đăng ký thông qua mã giảm giá tại trang chi tiết khóa học. Mã giảm giá sẽ được vô hiệu hóa khi đủ số lượng người theo thang bậc.
Đọc thêm
10 thủ thuật để tăng tốc độ ứng dụng .NET Core 3.x
Trong bài viết này mình sẽ đưa ra 10 mẹo để giúp bạn tăng tốc ứng dụng ASP.NET Core 3.
Đọc thêm
Migrate hệ thống ASP.NET Core 2.2 lên 3.1
Bài viết này mình đúc kết lại sau khi migrate toàn bộ hệ thống TEDU hiện tại từ .NET Core 2.2 lên 3.1 chia sẻ lại để mọi người cùng trao đổi
Đọc thêm
Tìm hiểu Unit Testing trong ASP.NET Core
Tiếp theo bài viết trước với tiêu đề Tìm hiểu về Dependency Injection trong ASP.NET Core. Hôm nay mình sẽ tập trung vào unit test.
Đọc thêm
Tìm hiểu về Dependency Injection trong ASP.NET Core
Bài viết này chúng ta sẽ cùng tìm hiểu về những điều thú vị xung quanh depedency injection và unit testing.
Đọc thêm
Cách sử dụng Yarn trong Visual Studio 2017
Cách sử dụng Yarn để quản lý các dependencies trong Visual Studio 2017
Đọc thêm